Tomcat 8.5+Oracle连接池未使用连接问题及PREV_SQL_ID有效性确认
连接池连接耗尽诊断:PREV_SQL_ID为空是否能判定连接未被使用?
我们有一个部署在Tomcat 8.5应用服务器上的Grails 2.5应用,某客户反馈其连接池出现连接耗尽问题。客户的DBA查询v$session视图后称存在从未被使用的“死”连接,并以PREV_SQL_ID列为空作为判定依据。我在内部开发及测试环境中均未遇到该场景。
我的核心问题:
- 以PREV_SQL_ID列为空判定未使用连接是否合理?
- 该字段为空意味着什么?是否本该为空?
补充说明:该应用对数据库依赖度极高,因此我认为连接池中的初始连接至少会被使用一次,尤其是在应用运行一段时间后。
参考信息
JDBC URL
标准格式:jdbc:oracle:thin:@//server.org:1522/service_name
Tomcat连接池配置(来自Datasource.groovy)
properties { jmxEnabled = true initialSize = 5 minIdle = 5 maxIdle = 25 maxWait = 10000 maxAge = 10 * 60000 timeBetweenEvictionRunsMillis = 5000 minEvictableIdleTimeMillis = 60000 validationQueryTimeout = 3 validationInterval = 15000 testOnBorrow = true testWhileIdle = true testOnReturn = false jdbcInterceptors = 'ConnectionState' defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED validationQuery = 'select 1 from dual' maxActive = 50 }
客户系统v$session查询结果(精简版)
| SID | Machine | Login | Prev exec start | PREV_SQL_ID | LAST_CALL_ET |
|---|---|---|---|---|---|
| 412 | Xyz | 2024/5/6 18:11 | 2024/5/6 18:11 | 8p7uxtbaga5gt | 0 |
| 4055 | Xyz | 2024/5/6 18:11 | 2024/5/6 18:11 | adg3hxn57syna | 3 |
| 10712 | Xyz | 2024/5/6 18:11 | 2024/5/6 18:11 | 520mkxqpf15q8 | 9 |
| 9512 | Xyz | 2024/5/6 18:11 | 2024/5/6 18:11 | 5xmx4tywy26y6 | 14 |
| 1638 | Xyz | 2024/5/6 18:11 | 2024/5/6 18:11 | 520mkxqpf15q8 | 9 |
| 11126 | Xyz | 2024/5/6 18:11 | 2024/5/6 18:11 | adg3hxn57syna | 0 |
| 1638 | Xyz | 2024/5/6 18:10 | 2024/5/6 18:11 | 520mkxqpf15q8 | 14 |
| 5873 | Xyz | 2024/5/6 18:10 | 2024/5/6 18:11 | 520mkxqpf15q8 | 9 |
| 2034 | Xyz | 2024/5/6 18:10 | 2024/5/6 18:11 | cdmran58d6r3t | 11 |
| 1229 | Xyz | 2024/5/6 18:10 | 2024/5/6 18:11 | 520mkxqpf15q8 | 11 |
| 5264 | Xyz | 2024/5/6 18:10 | 2024/5/6 18:11 | 520mkxqpf15q8 | 10 |
| 10326 | Xyz | 2024/5/6 18:09 | 2024/5/6 18:11 | 5xmx4tywy26y6 | 14 |
| 5882 | Xyz | 2024/5/6 18:08 | 2024/5/6 18:11 | 520mkxqpf15q8 | 10 |
| 815 | Xyz | 2024/5/6 18:07 | 2024/5/6 18:11 | 520mkxqpf15q8 | 9 |
| 1625 | Xyz | 2024/5/6 18:07 | 2024/5/6 18:11 | 520mkxqpf15q8 | 9 |
| 4453 | Xyz | 2024/5/6 18:07 | 2024/5/6 18:11 | 520mkxqpf15q8 | 14 |
| 4867 | Xyz | 2024/5/6 18:05 | 2024/5/6 18:11 | 520mkxqpf15q8 | 9 |
| 9101 | Xyz | 2024/5/6 18:05 | 2024/5/6 18:11 | 520mkxqpf15q8 | 9 |
| 2853 | Xyz | 2024/5/6 18:04 | 2024/5/6 18:11 | 520mkxqpf15q8 | 14 |
| 5276 | Xyz | 2024/5/6 18:02 | 2024/5/6 18:11 | 520mkxqpf15q8 | 9 |
| 4465 | Xyz | 2024/5/6 18:01 | 2024/5/6 18:11 | 520mkxqpf15q8 | 9 |
| 11119 | Xyz | 2024/5/5 10:52 | 2024/5/5 10:54 | 112624 | |
| 11123 | Xyz | 2024/5/4 18:56 | 2024/5/4 19:00 | 169871 | |
| 3664 | Xyz | 2024/5/4 12:18 | 2024/5/4 12:19 | 193926 | |
| 7090 | Xyz | 2024/5/3 19:20 | 2024/5/3 19:22 | 254946 | |
| 2448 | Xyz | 2024/5/3 17:38 | 2024/5/3 17:43 | 260858 | |
| 3236 | Xyz | 2024/5/3 17:34 | 2024/5/3 17:40 | 261039 | |
| 3642 | Xyz | 2024/5/3 17:13 | 2024/5/3 17:17 | 262431 | |
| 7496 | Xyz | 2024/5/3 17:01 | 2024/5/3 17:02 | 263344 | |
| 1644 | Xyz | 2024/5/3 16:14 | 2024/5/3 16:16 | 266088 | |
| 2027 | Xyz | 2024/5/3 16:14 | 2024/5/3 16:14 | 266225 |
我的调查
- 检索后未找到关于PREV_SQL_ID字段含义及其在连接池场景下表现的相关资料。
- 我的理解是:若连接存在问题,验证查询会失败,该连接会被移出连接池。
- 查阅了Tomcat关于废弃连接的文档,但有疑问:这些看似从未被使用的连接,是否仍可被视为废弃连接?如何判定并记录这种情况?
- 根据Paul W的建议,在v$session查询结果中添加了LAST_CALL_ET字段,从数据来看这些连接确实长期未被使用。
内容的提问来源于stack exchange,提问作者John Lear
相关产品推荐
相关产品推荐

