【问题标题】:Efficient way to validate a DB connection验证数据库连接的有效方法
【发布时间】:2011-12-10 12:00:19
【问题描述】:

我正在使用的数据库驱动程序(对于 sybase 数据库)没有实现 Connection.isValid()。在 Java 中使用查询(或其他方式)验证数据库连接的最有效方法是什么?

【问题讨论】:

    标签: java database sybase


    【解决方案1】:

    C3P0 和 DBCP 等库允许您提供验证查询,该查询通常非常简单,例如“选择 1”。因此,您可以采用相同的方法或简单地使用这些库中的任何一个(我的建议是 C3P0)。

    但是,与其在执行查询之前测试连接,您可以简单地尝试执行,然后在由于连接无效而失败时重试该操作。或者,您可以考虑一种非池连接方法,其中每次都即时创建连接(例如 Spring 的DriverManagerDataSource)。

    【讨论】:

    • @Brad:API 文档指出:“对于 J2EE 容器之外的测试或独立环境很有用”。它没有声明不要在生产环境中使用,我看不出它不适合的原因。愿意提供解释吗?
    • 嗨亚当斯基,你说的很对。技术上可以使用 DriverManagerDataSource 我将删除我的 -1,但是对于那些没有经验的读者,他们应该尝试在几乎所有情况下优先实现连接池而不是 DriverManagerDataSource。我记得过去很天真地使用 DriverManagerDataSource 并且池化的好处很多。 (我只是试图删除 -1 但除非编辑答案,否则我不能)
    • @Brad 我对答案做了一个简单的编辑。但是,我不同意没有经验的读者默认使用连接池。选择完全取决于问题域 - 例如,对于偶尔使用连接池访问数据库的单线程守护进程将完全浪费资源,因为没有真正需要维护打开的连接。我们曾经为每个应用程序使用连接池,有一天意识到我们已经完全耗尽了数据库服务器的资源。
    • 没问题,我已经更正了这个讨论的评级。回复:您耗尽服务器资源的问题,这表明您的客户端连接配置不正确,而不是连接池固有地创建的问题。
    【解决方案2】:

    我非常同意 Adamski 关于使用“从表中选择 1”作为检查连接性和使用连接池(例如 commons-dbcp、C3PO)的有效方法的评论。

    应用程序服务器(例如 Websphere)允许您为您配置此验证,因此您的应用程序代码不必知道它。您可以选择在使用之前始终检查连接,或者在创建新连接时验证连接池。您还可以定期清除连接,以防它们过时。

    如果您没有在应用程序服务器中运行,则可以使用具有此处描述的属性的 Common DBCP:

    http://commons.apache.org/dbcp/configuration.html

    或 C3PO 并查看使用 idleConnectionTestPeriod 属性。此链接讨论了与 Hibernate 的使用,但它通常仍与 C3PO 相关

    http://community.jboss.org/wiki/HowToConfigureTheC3P0ConnectionPool

    【讨论】:

      猜你喜欢
      • 2019-09-24
      • 2012-03-06
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      • 2013-04-01
      • 2018-09-02
      • 1970-01-01
      相关资源
      最近更新 更多