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 祈祷告诉。一个关闭的连接可重用的吗?怎么样? 你误解了这个问题。这不是答案。 @teppic try 导致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,使用哪个数据源