如何为安全连接池编写逻辑

时间:2012-05-04 11:09:00

标签: java multithreading connection-pooling

我正在使用Executors编写连接池。我的问题是,当数据库关闭时,池中的所有连接都将成为无效连接。

一种方法是定期刷新连接池,或检查连接的有效性。处理此类问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:5)

首先,如果你不是绝对的,绝对没有办法,必须自己编写,这是重塑一个完美的精细轮子的真正典型案例。 interwebz上有许多精细和花花公子的连接池实现。

我(以及其他许多人)使用Apache DBCP:http://commons.apache.org/dbcp/

如果你有某种超级特殊的数据库,你至少可以依赖现有的池化解决方案,如Commons Pool:http://commons.apache.org/pool/

你知道,使用apache的东西可以让你和那些很酷的孩子坐在一起;)

那么,如果你真的要自己编写,我建议你这样做:

每当请求连接时,请检查其是否有效。没办法解决这个问题。如果它不再有效,要么立即删除池中的所有连接(假设它们都是无效的),或者只是获取下一个连接,然后删除您选中的连接。重复,直到找到有效的或者您必须增加池。增长池将需要检查有效性并在无法建立新连接时中止(显然)。否则你手上会有一些精细的无限循环。

检查池并清理它和/或根据需要增长它的辅助线程似乎也很好。只是不要单独依赖它,因为它很可能会错过无效的连接,你仍然会提供不可用的池元素。

线程(或多个线程)可能仅用于加速(检查/增长池),但不适合自己完成工作。您必须根据请求检查/增长,辅助线程只能帮助避免这种情况。