Java Connection Pool 和 try-with 语句:连接实际上是关闭还是返回到池中?
Posted
技术标签:
【中文标题】Java Connection Pool 和 try-with 语句:连接实际上是关闭还是返回到池中?【英文标题】:Java Connection Pool and try-with statements: Is Connection actually closed or returned to pool? 【发布时间】:2017-09-15 07:55:12 【问题描述】:我有一个使用 KeyedObjectPool 类的 jdbc 连接池,我通过实现的方法 openConnection()
和 closeConnection()
使用它。 closeConnection()
通常只是将连接返回到池并仅在以前经常使用它时才将其关闭。因此它使用ConnectionPool.returnObject()
,它不会关闭连接对象(see here)。
class ConnectionPool
public openConnection(...)
...
public closeConnection()
...
但是,如果我像这样使用连接池:
try (Connection connection = sConnectionPool.openConnection(JdbcCredentials);)
doSomething();
catch (Exception e)
...
使用try-with
的连接对象是只返回到池中还是实际上用connection.close()
关闭(我不希望发生这种情况,因为它会使我的池无用)?
【问题讨论】:
【参考方案1】:它实际上是实际连接的包装器。 它将在幕后释放实际连接回池。进一步由池来决定实际连接是实际关闭还是重新用于新的 getConnection()。
【讨论】:
我试用了我的应用程序,但它似乎不起作用。 JVM 是如何知道我的连接是从连接池中获取的,并且它应该使用closeConnection()
而不是connection.close()
?【参考方案2】:
池连接上的close()
将其返回到池中,无论这是由try
还是您自己的代码引起的。
否则它不能被重用,所以它不会是一个连接池。
【讨论】:
@downvoter 祈祷告诉。一个关闭的连接是可重用的吗?怎么样? 你误解了这个问题。这不是答案。 @teppictry
导致close()
,close()
将其返回到池中,这是 OP 所询问的。
@teppic OP 现在接受了一个完全相同的答案。以上是关于Java Connection Pool 和 try-with 语句:连接实际上是关闭还是返回到池中?的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.IllegalStateException: Connection pool shut down
java大并发下Timeout waiting for connection from pool 解决方案
记录java 阿里oss频繁上传文件报错:网络连接错误,详细信息:Connection pool shut down
Mysql线程池系列一:什么是线程池和连接池( thread_pool 和 connection_pool)
ContentProvider Cannot perform this operation because the connection pool has been closed 细节讲解配上详细图解
带有 TransactionTemplate 和 Connection Pool 的 JDBCTemplate,使用哪个数据源