目前我正在使用Apache Commons Pool 1.6来管理GenericKeyedObjectPool连接池。我看到线程既抛出异常又无限期地挂起,这两者都导致从池中泄漏借来的连接。在使用returnObject()抛出异常的情况下,我已经纠正了连接的泄漏,但理想情况下,我希望池有一些方法来管理它并检索挂起或泄漏的连接。
从我的调查到目前为止,Commons Pool 1.x没有提供此功能,Commons Pool 2.x确实如此,但到目前为止,我无法找到这是如何完成的。
使用Apache Commons Pool 2挂起或泄露时,借用的连接如何被拉回到池中?
由于
答案 0 :(得分:1)
Apache commons pools2有一个AbandonedConfig,如果没有返回带有'removeAbandonedTimeout'定义的持续时间的借用对象,它有助于放弃它们。
示例:
AbandonedConfig abandonedConfig = new AbandonedConfig();
abandonedConfig.setRemoveAbandonedTimeout(evictAbandonedTime); // in seconds
abandonedConfig.setRemoveAbandonedOnBorrow(true); // on borrow, test when pool is starving
abandonedConfig.setRemoveAbandonedOnMaintenance(true); // and test pool when evicting
pool.setAbandonedConfig(abandonedConfig);
但是,AbandonedConfig仅适用于GenericObjectPool和NOT GenericKeyedObjectPoolConfig。
在commons pool2中实现此目的的唯一方法,也许是粗略的方法是,在GenericKeyedObjectPool中的单个键下使用多个GenericObjectPool实例(其池中只有一个对象),并使用AbandonedConfig设置GenericObjectPool。
我讨厌这个解决方案的事情是借两次,但从好的方面来说,第二次借用永远不会花费时间。