JDBC连接不可用

JDBC连接不可用,jdbc,websphere,database-connection,portlet,jdbctemplate,Jdbc,Websphere,Database Connection,Portlet,Jdbctemplate,我感谢大家为我的帖子提供解决方案/建议 环境:Portlet、Ibm Websphere、Java 场景:在门户应用程序中,每当我点击菜单项(或portlet)时,服务器通常会在一个小时内停机。无论我是保持在同一个菜单项(或portlet)中还是转到另一个菜单项(或portlet),这都无关紧要。因此,服务器关闭后,我们通常无法建立后端连接。 服务器中的连接池大小=50 在应用程序中:for中的数据库调用有一个900次迭代的循环。检查我知道的前50次迭代的日志,操作在几秒钟内就完成了。但从第51

我感谢大家为我的帖子提供解决方案/建议

环境:Portlet、Ibm Websphere、Java

场景:在门户应用程序中,每当我点击菜单项(或portlet)时,服务器通常会在一个小时内停机。无论我是保持在同一个菜单项(或portlet)中还是转到另一个菜单项(或portlet),这都无关紧要。因此,服务器关闭后,我们通常无法建立后端连接。

服务器中的连接池大小=50

在应用程序中:for中的数据库调用有一个900次迭代的循环。检查我知道的前50次迭代的日志,操作在几秒钟内就完成了。但从第51次迭代开始,会出现一个连接超时,表明JDBC连接不可用,此后每次迭代都需要3分钟(一直等待数据库连接,但没有得到连接)

示例代码:

listSize = 900;
for(int i=0; i < listSize; i++){

    // database query for setting a status message.

}
listSize=900;
for(int i=0;i
我们怀疑这可能是由于打开了数据库连接。因此,在达到池大小50后,连接不可用于第51次迭代。但是在应用程序中使用了spring的jdbcTemplate,它可以自动打开/关闭连接

问题:

listSize = 900;
for(int i=0; i < listSize; i++){

    // database query for setting a status message.

}
  • 这种情况的确切原因是什么?因为在for循环中使用DB调用会导致性能问题,并且不会从第51次迭代中提供到线程的连接
  • 如果spring自动关闭了连接,那么为什么它不提供从第51次到新迭代的连接呢
  • for循环迭代是否比spring的连接关闭更快?所以前50个线程在迭代,而不是从第51个线程开始
  • 当您说“服务器中的连接池大小=50”时,我假设您的意思是将max connections设置为50。正如您所怀疑的,您看到的行为表明空闲池正被连接请求耗尽。根据您的“for”循环,由查询引起的前50个连接请求是成功的,但由于连接没有返回到空闲池,第51个连接请求将发送到服务员池,并最终在180秒后超时。您认为SpringJDBCTemplate配置应该在完成时关闭()连接,从而将连接返回到池中,这是正确的,因此您需要调查发生这种情况的原因。使用tracept of rra=all对WebSphere Application server进行跟踪可能会让您有所了解,请参阅IBM知识中心主题。可以使用WAS.j2c=all获得额外的跟踪,但这将是冗长的。

    查看本文-。您可能正在使用可共享连接和本地事务。请尝试配置应用程序使用的资源引用,并将连接设置为
    不可缩放
    。在
    web.xml
    中放入类似的内容,并在Spring配置中使用
    java:comp/env/jdbc/datasourceRef

    <resource-ref>
    <res-ref-name>jdbc/datasourceRef</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Application</res-auth>
    <res-sharing-scope>Unshareable</res-sharing-scope>
    </resource-ref>
    
    
    jdbc/datasourceRef
    javax.sql.DataSource
    应用
    不可分享的
    
    问一个以上的问题通常表明你的问题过于宽泛,其次,你需要展示一些使用连接的代码。通常,您的代码必须关闭连接,以便及时将它们返回到连接池。如果您想要详细的答案,您必须发布更详细的代码。到目前为止,您发布的唯一代码示例是一个for循环,其中没有任何内容。。。