Oracle HikariCP在数据库没有运行会话时显示不可用的连接-如何查找原因?

Oracle HikariCP在数据库没有运行会话时显示不可用的连接-如何查找原因?,oracle,spring-boot,jdbc,spring-data-jpa,hikaricp,Oracle,Spring Boot,Jdbc,Spring Data Jpa,Hikaricp,我有一个使用Spring默认Hikari连接池的Spring Boot运行的应用程序。 最近,服务器开始出现不可用连接的问题: DEBUG HikariPool (411) - HikariPool-1 - Pool stats (total=20, active=20, idle=0, waiting=3) DEBUG HikariPool (411) - HikariPool-1 - Timeout failure stats (total=20, active=20, id

我有一个使用Spring默认Hikari连接池的Spring Boot运行的应用程序。 最近,服务器开始出现不可用连接的问题:

DEBUG HikariPool     (411) - HikariPool-1 - Pool stats (total=20, active=20, idle=0, waiting=3)
DEBUG HikariPool     (411) - HikariPool-1 - Timeout failure stats (total=20, active=20, idle=0, waiting=2)
WARN  SqlExceptionHelper(137) - SQL Error: 0, SQLState: null
ERROR SqlExceptionHelper(142) - HikariPool-1 - Connection is not available, request timed out after 30005ms.
由于它是一个共享数据库,首先我不确定它是否是我的应用程序中的一个问题。但是重新启动应用程序后,连接又恢复正常,因此我现在需要找到原因。该错误仅发生在全天候使用、每分钟执行许多操作的生产系统上。我试图通过扫描日志,寻找在连接上升之前执行的特定语句,找出导致Hikari中活动连接上升的原因——但总是有不同或不清楚的操作

因此,我们在数据库上执行了一个脚本,以返回所有活动连接(gv$session)。结果没有返回一个活动会话,即使Hikari日志同时显示活动连接。有人能告诉我这意味着什么和/或有线索在哪里找到这个问题的根本原因吗

我使用SpringBootV2.1.4。 这些是我的hikari设置:(spring.datasource.hikari.maximum pool size=20的默认设置)

调试HikariConfig(1020)-HikariPool-1-配置: 调试HikariConfig(1052)-allowPoolSuspension……….错误 调试HikariConfig(1052)-自动提交 调试HikariConfig(1052)-目录无 调试HikariConfig(1052)-连接InitSQL………..无 调试HikariConfig(1052)-connectionTestQuery……….无 调试HikariConfig(1052)-连接超时30000 调试HikariConfig(1052)-数据源………无 调试HikariConfig(1052)-数据源ClassName…………无 调试HikariConfig(1052)-数据源JNDI…………无 调试HikariConfig(1052)-数据源属性………{password=} 调试HikariConfig(1052)-driverClassName………….“oracle.jdbc.OracleDriver” 调试HikariConfig(1052)-healthCheckProperties………..{} 调试HikariConfig(1052)-healthCheckRegistry…………无 调试HikariConfig(1052)-idleTimeout 600000 调试HikariConfig(1052)-初始化失败超时…….1 调试HikariConfig(1052)-isolateInternalQueries……….错误 调试HikariConfig(1052)-jdbcUrl………jdbc:oracle:thin: 调试HikariConfig(1052)-泄漏检测阈值……….0 调试HikariConfig(1052)-最大寿命1800000 调试HikariConfig(1052)-最大工具大小20 调试HikariConfig(1052)-metricRegistry无 调试HikariConfig(1052)-metricsTrackerFactory……….无 调试HikariConfig(1052)-最小值20 调试HikariConfig(1052)-密码。。。。。。。。。。。。。。。。。。。。。。。。 调试HikariConfig(1052)-池名“HikariPool-1” 调试HikariConfig(1052)-只读错误 调试HikariConfig(1052)-registerMbeans………..错误 调试HikariConfig(1052)-调度执行器………..无 调试HikariConfig(1052)-架构无 调试HikariConfig(1052)-螺纹工厂内部 调试HikariConfig(1052)-事务处理………默认值 调试HikariConfig(1052)-用户名………无 调试HikariConfig(1052)-验证超时
启用
泄漏检测阈值=
(已记录)


它记录在指定时间内未返回到池的连接。

如果池统计数据显示最多有10个连接,您确定它是同一个池(最小/最大大小为20)?或者您的数据库服务器是否允许用户拥有超过10个连接,或者是否已达到阻止您的应用程序分配更多连接的总体最大值?@MarkrotVeel哦,您是对的,我增加了Hikari(spring.datasource.Hikari.maximum pool size=20)的池大小作为临时解决方案,但是很明显,除了连接在一段时间后不可用之外,它什么也没有改变。这听起来好像你的应用程序没有返回连接。确保代码在完成一个工作单元时关闭连接。关闭连接会将其返回池。是的,听起来不错,但我检查了每条语句,所有事务都使用JDBC存储库,默认情况下,JDBC存储库应该是事务性的,EntityManager的所有用法都有PersistentContext注释。我认为事务性足以确保它最终关闭连接?非标准,如直接获取连接,但在没有看到实际代码的情况下,这不是一件容易调试的事情,我不确定堆栈溢出是否适合这样做。考虑使用分析器(例如,您的工具包)来查看是否可以找到连接泄漏。
DEBUG HikariConfig   (1020) - HikariPool-1 - configuration:
DEBUG HikariConfig   (1052) - allowPoolSuspension.............false
DEBUG HikariConfig   (1052) - autoCommit......................true
DEBUG HikariConfig   (1052) - catalog.........................none
DEBUG HikariConfig   (1052) - connectionInitSql...............none
DEBUG HikariConfig   (1052) - connectionTestQuery.............none
DEBUG HikariConfig   (1052) - connectionTimeout...............30000
DEBUG HikariConfig   (1052) - dataSource......................none
DEBUG HikariConfig   (1052) - dataSourceClassName.............none
DEBUG HikariConfig   (1052) - dataSourceJNDI..................none
DEBUG HikariConfig   (1052) - dataSourceProperties............{password=<masked>}
DEBUG HikariConfig   (1052) - driverClassName................."oracle.jdbc.OracleDriver"
DEBUG HikariConfig   (1052) - healthCheckProperties...........{}
DEBUG HikariConfig   (1052) - healthCheckRegistry.............none
DEBUG HikariConfig   (1052) - idleTimeout.....................600000
DEBUG HikariConfig   (1052) - initializationFailTimeout.......1
DEBUG HikariConfig   (1052) - isolateInternalQueries..........false
DEBUG HikariConfig   (1052) - jdbcUrl.........................jdbc:oracle:thin:<masked>
DEBUG HikariConfig   (1052) - leakDetectionThreshold..........0
DEBUG HikariConfig   (1052) - maxLifetime.....................1800000
DEBUG HikariConfig   (1052) - maximumPoolSize.................20
DEBUG HikariConfig   (1052) - metricRegistry..................none
DEBUG HikariConfig   (1052) - metricsTrackerFactory...........none
DEBUG HikariConfig   (1052) - minimumIdle.....................20
DEBUG HikariConfig   (1052) - password........................<masked>
DEBUG HikariConfig   (1052) - poolName........................"HikariPool-1"
DEBUG HikariConfig   (1052) - readOnly........................false
DEBUG HikariConfig   (1052) - registerMbeans..................false
DEBUG HikariConfig   (1052) - scheduledExecutor...............none
DEBUG HikariConfig   (1052) - schema..........................none
DEBUG HikariConfig   (1052) - threadFactory...................internal
DEBUG HikariConfig   (1052) - transactionIsolation............default
DEBUG HikariConfig   (1052) - username........................none
DEBUG HikariConfig   (1052) - validationTimeout...............5000