J2EE Druid数据库连接池被占满的排查思路

  |  
阅读次数
  |  
字数 352
  |  
时长 ≈ 1 分钟

在使用Druid作为应用数据库连接池的时候,会经常出现连接池被占满的情况,报错信息如下:

1
2
3
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; 
nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException:
wait millis 60000, active 10, maxActive 10, creating 0

在此报错信息中,我们可以看到,我们的应用不能够再创建新的连接池,因为当前应用里活跃中的连接池数量已达到可允许被创建使用的最大值10个了,
所以新的线程创建不了连接池导致报错。

一般连接池不够用的情况可大致分两种:
1.连接池数量过少,这种手动调整连接池可创建的最大数即可。
2.sql语句执行过慢,导致连接池一直被占用。

针对第二种情况,在这里提供此情况的一点排查思路:
1.使用Druid的sql监控,获取较为耗时的sql语句。
2.获取语句后,通过SQLDeveloper工具,运行查看其执行计划(SQL执行栏第三个按钮:F10)。
3.分析其执行计划,每个条件执行的时间以及查询字段有没有走索引。
4.通过分析,优化查询语句以及让其语句走索引查询达到sql优化的效果。
5.这时候再观察应用侧有没有恢复正常。