如何正确关闭 HikariCP 连接池

我正在使用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 database

public Connection getConnection() throws SQLException {

    return ds.getConnection();

}


// Close the datasource

public 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和连接池的正确方法吗?


波斯汪
浏览 253回答 1
1回答

拉丁的传说

您不需要为每个连接调用 DataSource 的close() :关闭 DataSource 及其关联的池。它仅针对应用程序终止定义:close()在应用程序终止时是必不可少的您应该继续使用池,注意您正在关闭(正确)与资源的连接try&nbsp;(Connection&nbsp;connection&nbsp;=&nbsp;dataSource.getConnection()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java