为了账号安全,请及时绑定邮箱和手机立即绑定

如何正确关闭 HikariCP 连接池

如何正确关闭 HikariCP 连接池

波斯汪 2022-06-23 17:07:13
我正在使用HikariDataSource连接到MariaDB数据库。下面的类返回一个Connection.public class DataSource {private HikariDataSource ds;// The constructor takes db name as an argument and creates a new datasource for the connection accordingly.public DataSource(String dbString) {    HikariConfig config = new HikariConfig();    Map map = DbConfigParser.configKeyValue(dbString);    config.setJdbcUrl(String.valueOf(map.get("uri")));    config.setUsername(String.valueOf(map.get("uname")));    config.setPassword(String.valueOf(map.get("pwd")));    config.addDataSourceProperty("cachePrepStmts", "true");    config.addDataSourceProperty("prepStmtCacheSize", "250");    config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");    ds = new HikariDataSource(config);}// Returns a Connection to the databasepublic Connection getConnection() throws SQLException {    return ds.getConnection();}// Close the datasourcepublic void close(){    if (ds != null) {        ds.close();    }  }}这是执行选择查询的方法。该类还包含一个关闭方法public List<DataFile> getAllFiles() throws SQLException {try (Connection connection = dataSource.getConnection();    DSLContext ctx = DSL.using(connection, SQLDialect.MARIADB)) {  List<DataFile> dataFileList = new DataFileQueries().selectQuery(ctx)      .fetchInto(DataFile.class);  if (dataFileList == null || dataFileList.isEmpty()) {    throw new IllegalStateException("The List is Empty!");  }  return dataFileList;   }}public void close() {try {  dataSource.close();} catch (Exception e) {  LOG.error("A SQLException was caught", e); }}try-with-block 会Connection自动关闭对象,但是如何关闭连接池呢?我是否应该在数据库操作之后调用调用 close 方法,例如public static void main(String[] args) throws SQLException {DataFileDaoImpl service = new DataFileDaoImpl("testi");List<DataFile> list = service.getAllFiles();list.stream().forEach(    e -> System.out.println(e.toString()));service.close();}当我不调用该close()方法时,我看不到任何有关关机启动的控制台输出。这是关闭HikariDataSource和连接池的正确方法吗?
查看完整描述

1 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

您不需要为每个连接调用 DataSource 的close() :

关闭 DataSource 及其关联的池。

它仅针对应用程序终止定义:

close()在应用程序终止时是必不可少的

您应该继续使用池,注意您正在关闭(正确)与资源的连接

try (Connection connection = dataSource.getConnection()


查看完整回答
反对 回复 2022-06-23
  • 1 回答
  • 0 关注
  • 252 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信