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