2012-04-04 44 views
2

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

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

+0

当然,数据库有一个*连接,可能会被多个线程使用(例如通过连接池)。 – 2012-04-04 23:24:47

+0

在许多应用程序中,连接将显式分配给一个线程。连接通常不应该被多个线程同时使用(实现可能会使这成为可能,但很多不会)。当然,让连接池适当重用线程会更高效,但野外程序通常不会。有时分配连接会更容易。为什么复杂的问题? – Edmund 2012-04-05 00:29:45

回答

5

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

5

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

kill -QUIT your_process_id 

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

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

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

+0

重新记录和抽象层,BoneCP连接池带有一些有用的调试支持,包括'config.setCloseConnectionWatch()' - 它创建一个辅助线程来监视未发布的连接(带有性能警告)。 – 2012-04-06 09:01:35