这是对连接池的不正确使用。您永远不应调用close()
未包装的连接。
使用池连接的正常流程是
之所以有效,是因为该池具有包装器类,PoolableConnection
即that implements Connection
。PoolableConnection
委托底层连接来执行实际工作,但是(除其他事项外)实现方式close()
有所不同。这将破坏当前的PoolableConnection
包装,并将底层组件返回Connection
到连接池。例如。
这样,您的程序逻辑就可以从中获取连接,然后DataSource
使用Connection
和close()
,就像正常的非池化一样Connection
。
正是这种透明性使连接池易于使用。
现在,当您调用时unwrap
,PooledConnection
您就可以访问它的内部真实Connection
委托。
这有两个效果:
因此,您需要非常小心。 叫close()
上Connection
你已经从池中得到,将其返回到池中。 调用close()
基础连接。
因此,您的代码应为:
try (final Connection poolConn = DataSourceConnectionPool.getConnection()) {
final Connection conn = poolConn.unwrap(OracleConnection.class);
//do stuff with conn
//do not close conn!!
}
//poolConn is returned to the pool