什么方法可以用于调查Java中的数据库连接使用情况?

什么方法可以用于调查Java中的数据库连接使用情况?,java,database,jdbc,multithreading,Java,Database,Jdbc,Multithreading,什么方法可以用于调查Java中的数据库连接使用情况 一个开发人员正在支持一个复杂的Java程序,该程序在本地耗尽了可用的数据库连接数量。由于问题是零星的,因此了解哪个线程打开了到数据库的多个连接,以便将精力集中在这一领域是很有用的 最后,正确的解决方案似乎是重写程序以重用连接,而不是每个线程打开多个连接 我在问,开发人员应该在他的工具箱中使用什么方法来调查资源,即由线程分配的数据库连接。看一看。它使您能够查看jdbc上的所有内容,包括打开/关闭连接以及连接号信息。连接池可以为您提供一些诊断信息。

什么方法可以用于调查Java中的数据库连接使用情况

一个开发人员正在支持一个复杂的Java程序,该程序在本地耗尽了可用的数据库连接数量。由于问题是零星的,因此了解哪个线程打开了到数据库的多个连接,以便将精力集中在这一领域是很有用的

最后,正确的解决方案似乎是重写程序以重用连接,而不是每个线程打开多个连接


我在问,开发人员应该在他的工具箱中使用什么方法来调查资源,即由线程分配的数据库连接。

看一看。它使您能够查看jdbc上的所有内容,包括打开/关闭连接以及连接号信息。

连接池可以为您提供一些诊断信息。例如,签出C3P0连接池的debugUnreturnedConnectionStackTraces属性:

最近有人向我展示了“一个用于查明java代码中jdbc连接泄漏的简单工具”。到目前为止,我还没有亲自测试过它,但它应该可以让您看到谁在使用后没有关闭连接。看

但实际上,您应该使用连接池(例如)。

是一个开源框架,用于支持截取和选择性修改数据库语句的应用程序


P6Spy发行版包括以下模块:

  • P6Log。P6Log截取并记录使用JDBC的任何应用程序的数据库语句。此应用程序对于开发人员监视EJB服务器生成的SQL语句特别有用,使开发人员能够编写代码,从而在服务器上实现最高效率。P6Spy设计为在几分钟内安装,无需更改代码
  • 第六次大修。P6Output检测可能指示数据库中断问题的长时间运行语句,并将在执行期间记录超出可配置时间边界的任何语句。P6大修旨在通过只记录长时间运行的语句来最小化任何日志记录性能损失

    • 不是一种特定的工具,而是一种用于跟踪哪些代码负责打开连接或其他资源的调试技术

      我假设您在java端使用一致的方法来获得db连接(池连接与否无关紧要)

      其想法是围绕连接工厂/池或任何东西创建一个非常轻量级的包装器类。包装器将实现任何有意义的jdbc接口,这样您就可以将其替换为普通的连接对象,但大多数方法将透明地调用/返回底层连接

      如果您使用某种IoC框架(例如spring),您应该能够在配置级别轻松地交换connection/factory类。现在,所有java代码都将使用新的db连接包装器

      如果您使用的是池,那么调用
      connection.close()
      通常只是将对象返回到池中,而不是破坏连接。因此,这种技术适用于正常连接泄漏或只是“未返回池(池耗尽)”泄漏

      现在我们只需要记录一些有趣的信息,并设置一个陷阱来防止连接泄漏

      堆栈跟踪以标识创建者 在连接包装器的构造函数或工厂方法中,创建一个新的
      Throwable
      对象,并将其作为局部变量存储在包装器中,以备以后使用。我们使用可丢弃的
      Throwable
      ,因为它比使用
      Thread.currentThread().getStackTrace()更快/更便宜

      设置“陷阱” 在包装器类中实现
      finalize
      方法。这是GC在对象因不再使用而被销毁时调用的清理方法

      finalize
      方法应选中“我是否已关闭?”。如果已经关闭,那么一切都很好。。。但是,如果连接正在进行GCed,但尚未关闭。。。那么这是一个“泄漏”的连接

      现在,
      Throwable
      再次发挥作用。我们可以抓取可丢弃的
      twrowable
      ,并输出一条很好的日志消息,比如:“我是一个泄漏的连接,这里有一个涉及我的创建者的堆栈跟踪。”

      扩展想法 此方法可适用于各种情况。当然,您可以在包装器中保留其他类型的数据,以便对特定问题进行故障排除。例如,创建时间。然后你可以调查长期存在的联系,再次牵连到创造者。或者,您可以轮询现有连接,并解析可丢弃的堆栈跟踪,以获取关于哪个代码在一段时间内使用了多少个连接的数据


      可能有一个现成的工具也可以完成这些类型的工作,但在大多数情况下,应用此技术所需的代码量非常少(假设您有一种简单的方法可以在不替换整个代码库的情况下交换我们的数据库连接工厂)。

      P6Spy是一个不错的工具,我看不出它对查找连接泄漏问题有什么帮助。您要实现的方法称为
      finalize
      not
      finally
      。谢谢@Ring。固定的。从我的java时代起已经超过7年了。谢谢你的帮助。