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



我有一个带有MSSQL数据库连接的websphere应用服务器,连接池中有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循环重用相同的连接,并且我可以一遍又一遍地快速运行该进程而不会出现问题,因为每个线程似乎都在清理自己。知道发生了什么事或者怎么解决吗?我担心将来会有一个进程在运行过程中需要超过10个线程。

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

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

如果您使用的是不可共享连接,并且整个代码块不包含在全局事务中,则每个连接。Close将返回到池的连接,以便立即重用。如果您处于全局事务中,则每个连接在关闭后仍将不可用,因为它上仍有未完成的工作需要提交或回滚。

如果您使用的是可共享连接,并且每个连接请求都匹配(相同的用户/密码或没有),那么您应该继续获得相同的底层连接,并且不应该耗尽连接。但是,如果连接请求不匹配,那么连接将在作用域的持续时间内保持(可能是事务或请求作用域,如servlet边界),并且您将继续获得每个请求的新连接,直到耗尽为止。

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

最新更新