jdbc管理丢失连接的标准方法是什么?

时间:2012-01-25 02:07:14

标签: java database jdbc connect

我的应用程序有时会丢失与MySQL数据库的连接。 我认为好的解决方案是安排一些计时器在一段时间后尝试重新连接。 它可以做得更好吗?可能是试图连接到db的单独线程?还是存在标准做法? 感谢。

2 个答案:

答案 0 :(得分:2)

JDBC是开始构建java数据库应用程序的好方法,但是管理对象映射和连接/事务可以非常快速地导致很多锅炉板和逻辑的重写,这已经被许多程序员多次编写。

除非您拥有高吞吐量应用程序,否则您应该正常丢失/关闭连接,在这种情况下,您可能会保留多个连接(这称为连接池)。

维持有效的连接和交易基本上有3种“高级”方法:

1)最简单的解决方案是检查何时重新使用连接以确保其有效,或每次重新打开它。

2)更复杂的解决方案是使用连接池机制,例如apache http://commons.apache.org/dbcp/ dbcp库。

3)最后,在我看来,最易维护的解决方案是使用像ibatis / hibernate 这样的JDBC框架,它将为您提供一个简单的声明式接口来管理对象关系映射/事务/数据库状态----同时也为您透明地维护连接逻辑。

另请注意:如果对象关系映射不是您的事情,那么您可以使用Apache等DBUtils之类的框架来管理查询和连接,而不会使重量级数据映射阻碍。

答案 1 :(得分:1)

JDBC是一种简单的API,用于抽象不同数据库系统的操作。它使得某些东西变得统一,这种类型与java类型不同。

然而,丢失的连接是另一个大问题。使用连接池库比自己编写新库更好。从头开始实现连接池没有错误的细节太多了。

考虑使用成熟的库:

  • Commons-DBCP
  • bonecp

Commons DBCP基于Commons Pool。 您应该了解它们的可配置选项。 bonecp是另一个新的连接池,没有锁是它的优势。

验证的SQL字符串对于检查连接是死还是活是很重要的。 通过验证字符串集启用丢失的连接检查。

这是dbcp配置页面: http://commons.apache.org/dbcp/configuration.html

它说:

  

注意 - 对于具有任何效果的真值,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设置将对您有所帮助。

相关问题