Java JDBC mysql连接池[重复]
Posted
技术标签:
【中文标题】Java JDBC mysql连接池[重复]【英文标题】:Java JDBC mysql connection pooling [duplicate] 【发布时间】:2018-09-10 16:16:45 【问题描述】:所以我正在使用HikariCP 实现连接池。看起来很简单,但我有一些问题
看了一个教程,说代码应该是这样的:
Connection connection = null;
try
connection = hikary.getConnection();
...
...
catch(SQLException e)
e.printStackTrace()
finally
if(connection != null)
connection.close(); // why?
所以我知道我可能在问一个愚蠢的问题,但我不明白池的意义是什么,如果你每次得到一个都关闭连接?
这难道不是池化连接的全部目的吗?回收连接?
另一个问题是我假设这个hikari.getConnection()
方法是线程安全的?我有 99% 的把握,但是,我只是在我做的时候继续问。
【问题讨论】:
你应该真正了解try-with-resources,它会大大简化代码。请限制自己每个问题回答一个问题。 关于线程安全,像DataSource
这样的东西,尤其是提供连接池的数据源,被 JDBC 规范要求是线程安全的,但创建者 here is an answer HikariCP 明确表示它是线程安全的。
正如@MarkRotteveel 建议的那样,请使用try-with-resources。如果您始终如一地这样做,您将避免可能难以追踪的潜在连接泄漏。
【参考方案1】:
关闭它并没有真正关闭:它会将它返回到池中。
【讨论】:
【参考方案2】:Hikari 包装关闭连接(和对连接的操作),并在您通过其属性设置时使用其自己的处理活动/空闲连接池的机制。
Hikari getConnection 已同步块
// See http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java HikariPool result = pool; if (result == null) synchronized (this)
【讨论】:
以上是关于Java JDBC mysql连接池[重复]的主要内容,如果未能解决你的问题,请参考以下文章