有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JDBC连接直到线程结束才释放

我有一个带有MSSQL数据库连接的WebSphereApplicationServer,连接池中有10个数据库连接。当我的工作线程运行时,我有一个进程运行以下各项:

Psuedo code

for(List<String> items){
    Connection connection = null;
    Statement statement = null;
    try{
        connection = getConnection();
        statement = connection.createStatement();
        String sql = "exec someStoredProcedure '" + item + "';";
        statement.execute(sql);
    }finally{
        //real code includes null checks and try catch for errors
        statement.close();
        connection.close();
    }
}

我的问题是,如果我的循环大于10,它将挂起,直到遇到超时并出现错误“ConnectionWaitTimeoutException:J2CA1010E:连接不可用;等待180秒超时”

我认为关闭语句和连接将允许我重用池中的连接。螺纹完成后,连接会关闭/收集。我已经更新了我的代码,通过for循环重用相同的连接,我可以一遍又一遍地运行rapid fire过程而不会出现问题,因为每个线程似乎都会在自己完成后进行清理。知道发生了什么或如何解决吗?我担心将来我的进程在运行过程中需要超过10个线程


共 (1) 个答案

  1. # 1 楼答案

    您描述的行为听起来与连接池的工作方式不一致。然而,有许多重要的细节会影响连接重用,这些细节在您的writeup中并不明显

    您正在使用可共享或不可共享的连接。您可以通过查看用于数据源查找的资源引用来了解这一点。例如,@Resourceshareable=false或部署描述符资源引用与<res-sharing-scope>Unshareable</res-sharing-scope>是不可共享的,而如果前者设置为true,后者设置为Shareable,或忽略该属性,则连接是可共享的。如果您没有使用资源引用,连接通常是可共享的,除非您使用高级配置显式地覆盖了它

    如果您使用的是不可扫描的连接,并且整个代码块不包含在全局事务中,那么每个连接都会被删除。close将返回到池的连接,以便立即可重用。如果您在一个全局事务中,那么每个连接在关闭后都将保持不可用,因为仍有未完成的工作需要提交或回滚

    如果您使用的是可共享连接,并且每个连接请求都匹配(相同的用户/密码,或者所有人都没有),那么您应该继续获得相同的基础连接,并且不应该耗尽连接。但是,如果连接请求不匹配,那么连接会在作用域的持续时间内保持不变(可以是一个事务或像servlet boundary这样的请求作用域),并且在用完之前,您将不断获得与每个请求的新连接

    如果上述内容还不足以解决问题,请在场景中添加更多细节,说明可共享性、如何请求每个连接,以及事务边界和请求边界的位置,以便为特定场景提供更详细的答案