我正在使用Executors编写连接池。我的问题是,当数据库关闭时,池中的所有连接都将成为无效连接。
一种方法是定期刷新连接池,或检查连接的有效性。处理此类问题的最佳方法是什么?
答案 0 :(得分:5)
首先,如果你不是绝对的,绝对没有办法,必须自己编写,这是重塑一个完美的精细轮子的真正典型案例。 interwebz上有许多精细和花花公子的连接池实现。
我(以及其他许多人)使用Apache DBCP:http://commons.apache.org/dbcp/
如果你有某种超级特殊的数据库,你至少可以依赖现有的池化解决方案,如Commons Pool:http://commons.apache.org/pool/
你知道,使用apache的东西可以让你和那些很酷的孩子坐在一起;)
那么,如果你真的要自己编写,我建议你这样做:每当请求连接时,请检查其是否有效。没办法解决这个问题。如果它不再有效,要么立即删除池中的所有连接(假设它们都是无效的),或者只是获取下一个连接,然后删除您选中的连接。重复,直到找到有效的或者您必须增加池。增长池将需要检查有效性并在无法建立新连接时中止(显然)。否则你手上会有一些精细的无限循环。
检查池并清理它和/或根据需要增长它的辅助线程似乎也很好。只是不要单独依赖它,因为它很可能会错过无效的连接,你仍然会提供不可用的池元素。
线程(或多个线程)可能仅用于加速(检查/增长池),但不适合自己完成工作。您必须根据请求检查/增长,辅助线程只能帮助避免这种情况。