Unable to acquire JDBC Connection

1,004 阅读2分钟

记录一下该bug产生的原因和排查以及解决方法。

原因

  1. 数据库连接池中的连接数已经达到最大值,无法获取新的连接。

  2. 数据库连接池中的连接已经被占用,无法获取新的连接。

  3. 数据库连接池配置不正确,导致连接池无法正常工作。

  4. 数据库服务器故障或者网络故障,导致无法连接数据库。

  5. 应用程序的数据库访问代码存在问题,导致无法获取数据库连接。

  6. 数据库连接池中的连接被长时间占用,导致连接超时或者失效。

  7. 数据库连接池中的连接被意外关闭,导致无法获取新的连接。

以上原因中,最常见的是连接池中的连接数已经达到最大值,无法获取新的连接。

排查方式

  1. 首先要确定代码中使用完数据库连接后有进行关闭,调用close()方法:
Connection conn = null;
try {
    conn = dataSource.getConnection();
    // do something with the connection
} catch (SQLException e) {
    // handle exception
} finally {
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException e) {
            // handle exception
        }
    }
}
  1. 在数据库服务器上,查看当前连接数是否与预期相符。在MySQL中使用以下命令查看当前连接数:
-- 表示当前连接数:
show status like 'Threads_connected';
-- 正在运行的连接数:
show status like 'Threads_running';
-- 连接池中最大使用连接数:
show status like 'Max_used_connections';
  1. 在数据库服务器上,查看当前连接的状态。在MySQL中使用以下命令查看当前连接的状态:
show processlist;

如果连接状态为“Sleep”,则表示连接已经关闭。如果连接状态为“Query”,则表示连接正在执行查询操作,但是可能会在查询完成后自动关闭。

  1. 使用mysqladmin命令查看MySQL服务器状态:
mysqladmin -h ip地址 -u 用户名 -p密码 status