collection is close

http://www.iteye.com/topic/14474
经测试,将maxActive和maxIdle设为100/30,能承载更大的压力(需要更大的并发数才重现这个问题)。把它们设成3/3或更小,就极容易重现。

  经查资料,(一)的出现是因为代码中出现这种情况:从jndi获得数据库连接,没有在使用完返还数据库(调用close方法)。
经上设置,这样的连接,在经过removeAbandonedTimeout这个超时时间后,dbcp会自动回收,并把申请该资源时的调用栈信息log出来。
(根据其log的stacktrace查代码,发现俺们数据库连接都规规矩矩的关掉了)

  但是,依照我的log信息,似乎这样解释(又有想不通的地方):
并发数达到maxActive值的时候,再提交请求,就会log出(一),并返回一个连接,但这个连接.isClosed()是true,不能拿来用(faint!)
于是就出现了(二)的异常。 总结一下,(一)处是log信息,可以通过logAbandoned设为false禁止。(二)处为异常。
查看hibernate关于dbcp的配置,有:
引用
#当连接池中的连接已经被耗尽的时候,DBCP将怎样处理( 0 = 失败, 1 = 等待, 2= 增长)
hibernate.dbcp.whenExhaustedAction 1
而dbcp的官方文档没有whenExhaustedAction这一配置项。又见有人说hibernate的dbcp和apache commons的dbcp不大一样,俺不清楚。
我们系统没有用到hibernate.
总结:
    通过配置dbcp,可以提高稳定性。
问题:
    DBCP在超maxActive后到底是什么行为?
    如何通过系统配置进一步提高稳定性?
    如何处理上述怪现象?


http://topic.csdn.net/u/20090206/23/fcb94d20-c996-4e00-9951-966a509c849d.html

猜你喜欢

转载自gxh04007101.iteye.com/blog/1451925