JdbcPool.getConnection()卡死情況記錄
阿新 • • 發佈:2018-11-24
在做websocket開發的時候,後臺使用java開發,在前端連線的介面中,有讀取資料庫進行驗證的動作。其中連線資料庫部分使用了dbcp做緩衝池,在獲取連線的時候,使用了一個巢狀(這個巢狀簡直害死人,還我除錯了兩天),嵌套了兩個try finally,在每個try中都獲取連線getConnection,在每個finally中都釋放連線release把連線歸還給緩衝池。程式碼如下:
Connection conn = null;
Statement statement = null;
ResultSet rs = null;
try {
conn = JdbcPool.getConnection();
statement = conn.createStatement();
try {
conn = JdbcPool.getConnection();
statement = conn.createStatement();
} finally {
JdbcPool.release(conn, statement, rs);
}
} finally {
JdbcPool.release(conn, statement, rs);
}
真是自作聰明害死人,後來改成分開的兩個try finally問題解決了。
在其中除錯用的工具記錄下(jdk自帶工具):
jmap -histo,用來檢視各個類建立的物件個數。
jmap jmap -dump:format=b生成javadump檔案,再結合mat進行分析,可以明確的看到哪個類的物件佔了大量記憶體。
jstack 用來檢視各個執行緒的狀態,在我的工程中就看到了好幾個程序處於等待狀態,而且可以看到各個執行緒的棧呼叫,很方便。