哪个Java线程负责PostgreSQL数据库进程?

时间:2012-04-04 23:22:19

标签: java database linux postgresql jdbc

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

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

2 个答案:

答案 0 :(得分:5)

您可以将application_name(带有SET语句)设置为可以与Java线程名称匹配的内容。

答案 1 :(得分:5)

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

kill -QUIT your_process_id

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

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

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