2012-04-04 46 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