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 用来查看各个线程的状态,在我的工程中就看到了好几个进程处于等待状态,而且可以看到各个线程的栈调用,很方便。

posted @ 2018-11-24 12:45  太极者  阅读(1177)  评论(0编辑  收藏  举报