给定一个连接到 PostgreSQL 数据库(在 Linux 上)的 JVM,有没有办法找出 Java 中的哪个线程负责数据库中的一个进程?
注意:我正在调试一个资源泄漏错误,它显示为数据库中的一些空闲事务进程。将这些与负责的线程匹配会很有用,因为线程名称将缩小搜索范围。
给定一个连接到 PostgreSQL 数据库(在 Linux 上)的 JVM,有没有办法找出 Java 中的哪个线程负责数据库中的一个进程?
注意:我正在调试一个资源泄漏错误,它显示为数据库中的一些空闲事务进程。将这些与负责的线程匹配会很有用,因为线程名称将缩小搜索范围。
一个有用的技巧是向 Java 进程发送一个 SIGQUIT 信号,例如
kill -QUIT your_process_id
这不会杀死它,但会告诉它打印线程转储。这将列出所有线程,并回溯它们当前正在做什么。不幸的是,这通常不会包含像“conn.setAutoCommit(false)”这样明显的东西,但它会告诉你每个线程在哪里。
然后,您可以在代码中找到这些点并尝试回溯以查看事务开始之前是否有任何与提交/回滚不匹配的点。
编写应用程序时有用的另一件事是有一个创建和控制连接的公共位置(即另一个抽象层!)。当创建连接并将其分配给线程以及在其中一个线程上开始事务时,这将成为放置日志记录语句的好地方。
您可以将 application_name(使用SET
语句)设置为可以与 Java 线程名称匹配的名称。