1. 程式人生 > >JdbcPool.getConnection()卡死情況記錄

JdbcPool.getConnection()卡死情況記錄

在做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 用來檢視各個執行緒的狀態,在我的工程中就看到了好幾個程序處於等待狀態,而且可以看到各個執行緒的棧呼叫,很方便。