Apache Commons Pool 1 - > 2:调用池中的挂起或非活动连接对象

时间:2017-02-13 12:30:59

标签: java java-ee connection-pooling apache-commons apache-commons-pool

目前我正在使用Apache Commons Pool 1.6来管理GenericKeyedObjectPool连接池。我看到线程既抛出异常又无限期地挂起,这两者都导致从池中泄漏借来的连接。在使用returnObject()抛出异常的情况下,我已经纠正了连接的泄漏,但理想情况下,我希望池有一些方法来管理它并检索挂起或泄漏的连接。

从我的调查到目前为止,Commons Pool 1.x没有提供此功能,Commons Pool 2.x确实如此,但到目前为止,我无法找到这是如何完成的。

使用Apache Commons Pool 2挂起或泄露时,借用的连接如何被拉回到池中?

由于

1 个答案:

答案 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。
我讨厌这个解决方案的事情是借两次,但从好的方面来说,第二次借用永远不会花费时间。