java - 如何编写安全连接池的逻辑

标签 java multithreading connection-pooling

我正在使用执行器编写连接池。我的问题是,当数据库出现故障时,池中的所有连接都变成无效连接。

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

最佳答案

首先,如果你不绝对、绝对、没有办法,就必须自己编写,这是重新发明完美轮子的真正典型案例。 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/

相关文章:

java - 如何通过相对路径引用本地 XSD 文件

java - 带有 Grails 的 Vaadin

c++ - 尽管有线程,Qt GUI 仍挂起

java - 连接池在 Glassfish 中不起作用

java - 使用 'debugUnreturnedConnectionStackTraces' 调试连接丢失

java - 错误 :maven-resources-test:twitter_storm_new: java. lang.NegativeArraySizeException

java - 如何从一个类的多个构造函数中调用一个公共(public)静态实用程序方法,而跨构造函数只调用一次?

mysql - 一个数据库多个接口(interface)

c++ - 如何一直运行固定数量的线程

spring - HikariConfig 和 maxPoolSize