0

当前我正在使用Apache Commons Pool 1.6来管理GenericKeyedObjectPool连接池。我看到线程既抛出异常又无限期挂起,这两者都导致借用连接从池中泄漏。我已经纠正了在使用returnObject()抛出异常的情况下连接的泄漏,但理想情况下,我希望某种方式让池管理这个并检索挂起或泄露的连接。Apache Commons Pool 1 - > 2:调用连接到池的挂起或非连接对象

从我调查到目前为止,Commons Pool 1.x不提供此功能,并且Commons Pool 2.x确实存在,但至今我无法找到如何完成此操作。

当使用Apache Commons Pool 2挂起或泄漏时,借用连接如何拉回池中?

感谢

回答

0

阿帕奇百科全书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。

在common2 pool2中实现这一点的唯一方式,可能是粗糙的方法是,在GenericKeyedObjectPool中的一个键下使用多个GenericObjectPool实例(在其池中只有一个对象),并使用AbandonedConfig设置GenericObjectPool。

我讨厌这个解决方案的事情是做两次借,但在光明的一面,第二次借款永远不会需要时间。