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