这个问题我实在是为整个 springsource 的员工蒙羞 如果大家使用 spring 控制事务,使用 Open Session In View 模式, com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool-- timeout at awaitAvailable() com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector -- APPARENT DEADLOCK!!! 还有诸如之类的若干 c3p0 报出的错误,对于流量稍大一点的网站,一般都会出现 当然,我确切的知道其原因是什么。 我只是想知道这个巨大的问题为什么这么多年过去了,仍旧在反复的不断地恼人的无解的一再发生。 我花了些时间 google 了一下,发现搜索 "com.mchange.v2.resourcepool.TimeoutException" 这个字符串,前 5 页都没有给出正确答案。 有一些解决方案,我称为workaround,并不是solution,例如 workaround1:
workaround2: 是Spring 中配置c3p0 的时候,有一个配置属性是checkoutTimeout,把这个配置属性去掉就正常了。 好了,我来评价下这两种 w orkaround 第一种:这么搞下去,你的数据库连接数迟早会用光,到时结果是一样的,好比得了癌症这样做只是让你晚死几年。 第二种:很可笑,数据库死锁已经发生了,只不过牺牲掉等待的线程罢了,好比说有人在排队等饭吃,但永远等不到,你跟他说说别等了,直接自裁算了。算是很善良的做法,但是人终归是死了,换句话说,那个线程终归是未能给用户返回正确的request。 另外,还有很多兄弟将这类问题归咎于无辜的c3p0,例如这样的文章标题: "谁来拯救 C3P0 的致命伤" 迄今为止,很少有人(我是没发现)了解,这个问题实际上是Spring的致命伤,我不清楚 Spring 的人晓不晓得这个问题,反正我 google 了一下 springsource.org 的网站,仅有两篇相关的论坛帖子,最终没有适当的回复。 两篇?! 如果说在座的各位曾经run 过流量较大的网站,也用Spring 做事务控制,我想有相当一部分都遇到这个问题,并且类似的问题在google 上用英文问的人不计其数,有正确回答吗?没有,至少我没看到。 如何解释如此多人遇到此类问题,而 spring 的论坛上只有两篇相关的论坛帖子呢? 我不惮...