如何使用Apache公共游泳池因超时而返回的对象池(How to return objects to

2019-07-29 21:12发布

我使用的Apache共享池库维修器材couchbase连接池(可以看作是任何类型的连接,其实并不重要)。

我现在面临的问题是,我找到对象返回到池中的唯一途径是通过调用从GenericObjectPool返回object的方法来做到这一点编程。 这迫使以保证一旦从池借用的对象在应用程序中的回报,无论任何异常或意外的行为的应用程序。

即使我控制对象在整个应用程序池的回报,我觉得有风险的完全依赖程序员返回的对象。 有谁知道一种方法来自动返回一旦超过了规定的超时对象(回收的对象)。 这也将工作的任何方式,使池中创建新的对象,一旦超过了借来的对象超时。

PS:我的应用程序公开了一组REST Web服务,连接到分布式内存缓存服务器(Couchbase)。 池创建了一套Couchbase连接。

任何建议将帮助!

编辑

我已经尝试的第一个解决方案是创建一个新类(CouchbaseClientHandler)含有从存储在池(CouchbaseClient)的对象的类型的连接对象。 我实现了对CouchbaseClientHandler finalize方法,确保相关联的实际返回到池中,如果此对象的引用渐渐由一个意外的异常丢失。 当垃圾回收器销毁对象的对象将被返回。 如预期这并没有奏效。 是无法预测在垃圾收集器将到达一个回收对象,并且它通常采取高于所需的时间。

其实我已经工作,现在的解决方案是一个有点不同,但有很多更安全。 由于我的泳池旨在通过Web服务一起使用,因为每一个Web服务在一个单独的和唯一的线程(我使用的是新泽西州在Tomcat)正在运行,我决定使用映射唯一主题标识的静态HashMap中的变量到CouchbaseClient对象的列表创建从web服务的执行池借用。 由于我的网络服务以这样的方式,不管发生什么事而设计的一种处理方法返回之前将处理最后的输出,我可以肯定始终运行,返回到池中那些借来的对象(连接)的方法,即没有得到有效返回到池中。

虽然这个工作相当好对我来说,我真的想知道是否有自称或尚未返回超时借来的对象抹的更好的方法。

Answer 1:

假设毁灭/创造新的方法是确定,使用的是公共游泳池的2.0+版本,你可以用废弃的对象追踪和清除,以确保容量时,对象都是借来的,再也没有回来不会永久泄露。 见AbandonedConfig的Javadoc的配置设置和GenericObjectPool构造函数的AbandonedConfig实例作为参数。 随着抛弃的对象跟踪和清除启用,池将破坏已借用的,但是当池处于低容量不返回比removeAbandonedTimeout长的情况。

如果由于某种原因,你必须使用一个1.x版本库,你可以抓住源或直接使用AbandonedObjectPool附带的DBCP 1.x的



文章来源: How to return objects to the Pool by timeout using apache commons pool