JdbcPool.getConnection()卡死情况记录

本文分享了一次在WebSocket开发中遇到的Java DBCP数据库连接池调试经历,详细描述了由于不当的try-finally嵌套导致的连接泄漏问题及解决过程,涉及jmap和jstack等工具的使用。
摘要由CSDN通过智能技术生成

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

转载于:https://www.cnblogs.com/youyipin/p/10011693.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值