【问题标题】:What the standard way in jdbc to manage lost connection?jdbc 中管理丢失连接的标准方法是什么?
【发布时间】:2012-01-25 02:07:13
【问题描述】:
我的应用程序有时会失去与 MySQL 数据库的连接。
我认为好的解决方案是安排一些计时器在一段时间后尝试重新连接。
它可以做得更好吗?可能是尝试连接到数据库的单独线程?还是存在标准做法?
谢谢。
【问题讨论】:
标签:
java
database
jdbc
connect
【解决方案1】:
JDBC 是开始构建 java 数据库应用程序的好方法,但管理对象映射和连接/事务会很快导致大量样板文件和重写许多程序员已经多次编写的逻辑。
预计您应该正常丢失/关闭连接,除非您有一个高吞吐量的应用程序,在这种情况下,您可能会保持多个连接处于活动状态(这称为连接池)。
基本上有 3 种“高级”方法来维护有效的连接和事务:
1) 最简单的解决方案是检查您何时重用连接以确保它有效,或者每次都重新打开它。
2) 更复杂的解决方案是使用连接池机制,例如 apache http://commons.apache.org/dbcp/ dbcp 库。
3) 最后,在我看来,最可维护的解决方案是使用像 ibatis/hibernate 这样的 JDBC 框架,它将为您提供一个简单的、声明性的接口来管理对象关系映射/事务/数据库状态----同时也透明地为你维护连接逻辑。
ALSO:如果对象关系映射不是您的菜,那么您可以使用 Apache 的 DBUtils 等框架来管理查询和连接,而不会妨碍重量级的数据映射。
【解决方案2】:
JDBC 是一个简单的API,用于抽象不同数据库系统的操作。它使某些东西变得统一,例如与 java 类型不同的原生类型。
但是,丢失的连接是另一个大问题。使用连接池库比自己写一个新的要好。从零开始实现一个没有bug的连接池,细节太多了。
考虑使用成熟的库:
Commons DBCP 基于 Commons Pool。
您应该了解它们的可配置选项。
bonecp 是另一个新的连接池,没有锁是它的优势。
验证的 SQL 字符串对于检查连接是死是活很重要。
通过验证字符串集启用丢失连接检查。
这里是 dbcp 配置页面:
http://commons.apache.org/dbcp/configuration.html
上面写着:
注意 - 要使 true 值产生任何影响,validationQuery
参数必须设置为非空字符串。
例如:
dataSource.setValidationQuery(isDBOracle() ? "select 1 from dual" : "select 1");
dataSource.setTestWhileIdle(true);
dataSource.setTestOnReturn(true);
dataSource.setRemoveAbandoned(true);
dataSource.setRemoveAbandonedTimeout(60 * 3 /* 3 mins */);
dataSource.setMaxIdle(30);
dataSource.setMaxWait(1000 * 20 /* 20 secs*/);
提醒:如果你在 weblogic 中使用 Common DBCP,不要忘记服务器中较旧的 Commons 库,它会驱动你的应用程序使用不同的版本。 prefer-web-inf-classes 设置将为您提供帮助。