我们有一个运行良好多年的Web应用程序。 Web应用程序使用的是mysql,spring-1.2.6和ibatis。
用spring-3.2.0替换spring-1.2.6后,我们开始注意到一个问题,即由于某种原因,对特定页面的多个并发请求总是挂起。
jConsole为每个并发线程显示以下内容:
java.lang.Thread.State: WAITING on
org.apache.commons.pool.impl.GenericObjectPool$Latch@b6b09e
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1104)
经过调查,我们发现这个问题与resultMap有关,如下所示。对于spring-1.2.6,每个线程只需要一个连接,而不管结果集中的行数是多少。但是,对于spring-3.2.0,每个线程需要N + 1个连接(取决于返回的行数)。因此陷入僵局。 (我们在配置中使用maxActive属性的默认值(8)。)
如何修复它以便在这种情况下重用连接?感谢。
<resultMap id="resultBlog" type="Blog">
<id property="id" column="idBlog" />
<result property="name" column="blogname" />
<result property="url" column="blogurl" />
<result property="author" column="idBlog" select="selectAuthor" />
</resultMap>