我一直在寻找在我的应用程序的一部分中实现池化。我想使用Commons Pool库,但稍微关注close()
行为的工作原理。通过查看javadoc和源代码,在调用close()
方法时,在池中创建的对象是否会被销毁似乎并不清楚。从我所看到的,只有在池中空闲的对象才会被销毁 - 任何正在使用但尚未被返回的对象都不会被触及。
我错过了什么吗?我想确保在关闭池时正确销毁所有对象。
之前有人使用过这个并且知道它是如何工作的吗?
答案 0 :(得分:2)
一般来说(无论池库如何),销毁正在使用的对象是不安全的。这样做很可能会导致异常。如果您想保证干净关闭,那么您需要确保所有对象都已返回池中。
是否有理由在所有对象都返回池之前关闭?
答案 1 :(得分:1)
如Commons Pool 2中close
方法的javadoc所述,当调用此方法时,会销毁空闲实例,但不会影响检出客户端的实例。在close
之后,borrowObject
将失败并显示IllegalStateException
,但returnObject
将成功,返回的实例将被销毁。因此,一旦关闭池,如果您的客户端可以依赖于返回对象,则实例将被清除。如果要阻止此操作,请观看numActive
。 close
还从jmx注销池,因此在这种情况下直接使用getNumActive
。