我们有一个运行良好多年的 Web 应用程序。Web 应用程序使用 mysql、spring-1.2.6 和 ibatis。
将 spring-1.2.6 替换为 spring-3.2.0 后,我们开始注意到一个问题,即对特定页面的多个并发请求总是由于某种原因而挂起。
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>