记录一下该bug产生的原因和排查以及解决方法。
原因:
-
数据库连接池中的连接数已经达到最大值,无法获取新的连接。
-
数据库连接池中的连接已经被占用,无法获取新的连接。
-
数据库连接池配置不正确,导致连接池无法正常工作。
-
数据库服务器故障或者网络故障,导致无法连接数据库。
-
应用程序的数据库访问代码存在问题,导致无法获取数据库连接。
-
数据库连接池中的连接被长时间占用,导致连接超时或者失效。
-
数据库连接池中的连接被意外关闭,导致无法获取新的连接。
以上原因中,最常见的是连接池中的连接数已经达到最大值,无法获取新的连接。
排查方式:
- 首先要确定代码中使用完数据库连接后有进行关闭,调用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
}
}
}
- 在数据库服务器上,查看当前连接数是否与预期相符。在MySQL中使用以下命令查看当前连接数:
-- 表示当前连接数:
show status like 'Threads_connected';
-- 正在运行的连接数:
show status like 'Threads_running';
-- 连接池中最大使用连接数:
show status like 'Max_used_connections';
- 在数据库服务器上,查看当前连接的状态。在MySQL中使用以下命令查看当前连接的状态:
show processlist;
如果连接状态为“Sleep”,则表示连接已经关闭。如果连接状态为“Query”,则表示连接正在执行查询操作,但是可能会在查询完成后自动关闭。
- 使用mysqladmin命令查看MySQL服务器状态:
mysqladmin -h ip地址 -u 用户名 -p密码 status