我有一個通過JPA(EclipseLink)訪問Postgres數據庫的Java程序。
首先我讓JPA創建數據庫。
然後我運行一個java.sql.Connection(我通過在實體管理器上解開()得到一個操作創建的數據庫的pgsql腳本。
實體管理器被配置爲使用連接池(c3p0)。
腳本的一部分刪除了表列表的約束。
由於某些原因,在刪除多個表後,它會卡住。
沒有其他活動事務(pg_stat_activity),並且沒有任何未授予的鎖(pg_locks)。
我已經在drop constraint語句之前和之後添加了調試打印,並且它們都被打印出來,所以它似乎卡在循環的中間。 從和pg_stat_activity選擇當返回以下結果對相關交易:postgres plsql腳本循環卡住
Waiting: false
State: Active
Query: Empty
從檢查出CPU的使用,這樣似乎Postgres的過程是空閒的。 當我從pgAdmin運行該腳本時,它不會卡住,只有當它從Java程序運行時。 通常在200次循環迭代後卡住,但它也卡在其他循環中。 重新綁定代碼後,問題消失兩次(true Vodou)。
我對這種場景的Postgres分析工具更感興趣。 任何想法或技術來解決這個僵局將不勝感激。
- 其解決這個問題的一個解決方法是打開一個新的JDBC連接並從那裏運行它,但我仍然有興趣瞭解如何解決這類問題的詮釋,他的未來。
如果您使用的是Linux,您是否試過運行卡住的進程'strace -p'?你可以通過查詢'pg_stat_activity'來查看pid。此外,「pg_stat_activity」中查詢的「狀態」列的值是什麼? –
bma
我已將缺少的信息添加到問題中。謝謝。 @bma –
如果確實沒有鎖定查詢並且數據庫中似乎沒有發生任何事情,請對此進行處理。這裏是一個有用的外觀教程:http://www.hokstad.com/5-simple-ways-to-troubleshoot-using-strace – bma