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