【发布时间】:2016-06-20 19:40:26
【问题描述】:
我们正在尝试将 HikariCP(2.4.4 版)集成到我们的应用程序中。使用一段时间后,池无法获取新连接抛出:
java.lang.NullPointerException
at com.zaxxer.hikari.pool.PoolBase.setNetworkTimeout(PoolBase.java:464) ~[HikariCP-2.4.4.jar:?]
at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive(PoolBase.java:131) ~[HikariCP-2.4.4.jar:?]
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:171) ~[HikariCP-2.4.4.jar:?]
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:147) ~[HikariCP-2.4.4.jar:?]
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:83) ~[HikariCP-2.4.4.jar:?]
我们使用的 jdbc 驱动程序是 ojdbc-7,版本为 12.1.0.2。池使用以下配置:
allowPoolSuspension.............false
autoCommit......................false
catalog.........................null
connectionInitSql..............."BEGIN EXECUTE IMMEDIATE 'SET ROLE SOME_ROLE IDENTIFIED BY SOME_PASSWORD '; END;"
connectionTestQuery............."SELECT 1 FROM DUAL"
connectionTimeout...............15000
dataSource......................null
dataSourceClassName.............null
dataSourceJNDI..................null
dataSourceProperties............{v$session.machine=host, password=<masked>, v$session.program=my application}
driverClassName................."oracle.jdbc.OracleDriver"
healthCheckProperties...........{}
healthCheckRegistry.............null
idleTimeout.....................60000
initializationFailFast..........true
isolateInternalQueries..........false
jdbc4ConnectionTest.............false
jdbcUrl........................."jdbc:oracle:thin:@//host.company.com:1521/database.company.com"
leakDetectionThreshold..........1800000
maxLifetime.....................0
maximumPoolSize.................18
metricRegistry..................null
metricsTrackerFactory...........null
minimumIdle.....................2
password........................<masked>
poolName........................"TEST_POOL"
readOnly........................false
registerMbeans..................false
scheduledExecutorService........null
threadFactory...................null
transactionIsolation............null
username........................"USER_NAME"
validationTimeout...............5000
是错误还是配置错误?
【问题讨论】:
-
你是否
closeing 连接完成后将它们返回到池中? -
@OldCurmudgeon 是的,大多数情况下我们只是简单地调用 connection.close()。有时我们会在调用 close 之前额外使用 evictConnection。
-
大部分???您应该在
finally中使用close,以便它始终被释放到池中。没有充分理由使用evictConnection可能不是一个好主意 - 你为什么要这样做? -
@OldCurmudgeon 保证调用 close(主要是不调用 evictConnection)。我们有一个系统特定的租户系统。当租户在会话上初始化时,一旦无法为另一个租户重用该会话。出于这个原因,我们需要移除该连接。
标签: java oracle jdbc datasource hikaricp