【问题标题】:Which Java thread is responsible for a PostgreSQL database process?哪个 Java 线程负责 PostgreSQL 数据库进程?
【发布时间】:2012-04-04 23:22:19
【问题描述】:

给定一个连接到 PostgreSQL 数据库的 JVM(在 Linux 上),有没有办法找出 Java 中的哪个线程负责数据库中的一个进程?

注意:我正在调试一个资源泄漏错误,它显示为数据库中的一些空闲事务进程。将这些与负责的线程匹配会很有用,因为线程名称会缩小搜索范围。

【问题讨论】:

  • 肯定有一个到数据库的连接,它可能被多个线程使用(例如通过连接池)。
  • 在许多应用程序中,连接将被显式分配给线程。连接通常不应该由多个线程同时使用(实现可能使这成为可能,但很多都没有)。当然,拥有一个适当地重用线程的连接池可能会更有效,但野外的程序通常不会这样做。有时,分配连接更容易。为什么要把问题复杂化?

标签: java database linux postgresql jdbc


【解决方案1】:

您可以将 application_name(使用 SET 语句)设置为可以与 Java 线程名称匹配的名称。

【讨论】:

    【解决方案2】:

    一个有用的技巧是向 Java 进程发送一个 SIGQUIT 信号,例如

    kill -QUIT your_process_id
    

    这不会杀死它,但会告诉它打印线程转储。这将列出所有线程,并回溯它们当前正在做什么。不幸的是,这通常不会包含像“conn.setAutoCommit(false)”这样明显的内容,但它会告诉你每个线程的位置。

    然后,您可以在代码中找到这些点并尝试回溯,以查看是否有任何提交/回滚无法匹配的事务开始之前。

    在编写应用程序时另一件有用的事情是有一个创建和控制连接的公共位置(即另一个抽象层!)。当创建连接并将其分配给线程以及在其中一个线程上开始事务时,这将成为放置日志记录语句的好地方。

    【讨论】:

    • 重新记录和抽象层,BoneCP 连接池提供了一些有用的调试支持,包括config.setCloseConnectionWatch()——它创建了一个辅助线程来监视未释放的连接(带有性能警告)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多