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连接池[重复]的主要内容,如果未能解决你的问题,请参考以下文章

jdbc连接池

JDBC MySql 连接池实践避免连接池耗尽

Java使用JDBC连接数据库

阿里巴巴连接池(Druid)

JAVA基础-JDBC连接池

JDBC java数据连接 读取properties 数据库连接池 预编译