Apache Commons Pool的close()行为是什么?

8
我一直在寻求在我的应用程序的某个部分实现池化。我想使用Commons Pool库,但是对于close()方法的行为有些担忧。从查看javadoc和源代码来看,似乎不清楚在调用close()方法时,池中创建的对象是否会被销毁。据我所见,只有闲置在池中的对象才会被销毁-正在使用且尚未返回的对象将不会被处理。
我有遗漏什么吗?我想确保在关闭池时所有对象都被正确销毁。
有人以前使用过这个库并了解它的工作原理吗?

你是指哪个 close() - skaffman
2个回答

4

根据Commons Pool 2中close方法的javadoc所述,当调用此方法时,空闲实例将被销毁,但分配给客户端的实例不受影响。在执行close之后,borrowObject将失败并抛出IllegalStateException异常,但returnObject将成功,并在返回时销毁返回的实例。因此,如果您的客户端可以保证在您关闭池后返回对象,则实例将会被清理。如果要阻塞直到完成此操作,请观察numActive。在这种情况下,close还将从JMX中注销池,因此请直接使用getNumActive


对于已经调用close()方法的池,在调用pool.close()方法并且借用了对象,而且经过了一段时间(否则会触发“Abandoned”配置)...这时会触发“Abandoned”调用吗? - johnm

3

一般来说(不考虑连接池库),销毁正在使用的对象是不安全的。这样做很可能会导致异常。如果您想保证干净的关闭,那么您需要确保所有对象都已经返回到连接池中。

您在所有对象都返回到连接池之前进行关闭的原因是什么?


1
当我的应用程序被关闭(可能是由系统管理员),池化对象可能正在使用中。但是,为了释放分配给这些对象的资源,在应用程序退出之前,我仍然需要关闭它们。理想情况下,对池上的close()的调用应该像这样工作:1)防止借用任何新对象 2)关闭池中空闲的对象 3)在所有对象都已返回到池中时,关闭借用的对象,阻塞直到所有对象都已返回这似乎并不是一个不寻常的要求。 - DrewEaster
1
Apache处理(1)和(2)。要解决问题(3),考虑子类化池类并自己处理close()。我猜在Apache实现中清除/排空池不是因为处理一般情况很棘手,由于线程和超时问题。 - jdigital
@drewzilla:(3a)如果池已关闭,则Apache Commons Pool在返回时销毁借用的对象,现在已经在javadoc中了。 (3b)http://stackoverflow.com/questions/13355752/how-to-shutdown-a-generickeyedobjectpool-safely - palacsint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接