我正在开发一个始终运行约15个线程的应用程序。我们最近开始使用HikariCP进行连接池。
这些线程每24小时重新启动一次。重新启动线程后,我们通过调用dataSource.close()
显式关闭Hikari数据源,直到开始使用连接池之前,一个连接对象已在线程中传递给所有函数。现在,当关闭dataSource时,如果旧的connection
对象已经传递给方法,则返回一个错误,表明该dataSource已经关闭,这是有道理的。
要解决此问题,我们开始在DBUtils
类(基本具有查询功能)的方法中创建它们,而不是在线程中传递相同的连接对象
这是我们应用程序中线程的运行方法如下:
@Override
public void run() {
consumer.subscribe(this.topics);
while (!isStopped.get()) {
try {
for (ConsumerRecord<Integer, String> record : records) {
try{
/*some code*/
}catch(JsonProcessingException ex){
ex.printStackTrace();
}
}
DBUtils.Messages(LOGGER.getName(),entryExitList);
} catch (IOException exception) {
this.interrupt();
}
consumer.close();
}
现在,在开始使用HikariCP之后,我们无需将连接对象传递给DBUtils.Messages
,而是从方法本身的池中获得连接
即
public static final void Messages(String threadName, List<EntryExit> entryExitMessages) throws SQLException {
Connection connection = DBUtils.getConnection(threadName);
/*code*/
try{
connection.close();
}catch(SQLException se){}
}
这是getConnection
的{{1}}方法的样子
DBUtils
但是由于对该方法的调用在线程的 public static synchronized Connection getConnection(String threadName) {
Connection connection = null;
try {
if (ds == null || ds.isClosed()) {
config.setJdbcUrl(getProperty("postgres.url"));
config.setUsername(getProperty("postgres.username"));
config.setPassword(getProperty("postgres.password"));
config.setDriverClassName(getProperty("postgres.driver"));
config.setMaximumPoolSize(getProperty("postgres.max-pool-size"));
config.setMetricRegistry(ApplicationUtils.getMetricRegistry());
config.setConnectionTimeout(getProperty("postgres.connection-timeout"));
config.setLeakDetectionThreshold(getProperty("postgres.leak-detection-threshold"));
config.setIdleTimeout(getProperty("postgres.idle-timeout"));
config.setMaxLifetime(getProperty("postgres.max-lifetime"));
config.setValidationTimeout(getProperty("postgres.validation-timeout"));
config.setMinimumIdle(getProperty("postgres.minimum-idle"));
config.setPoolName("PostgresConnectionPool");
ds = new HikariDataSource(config);
}
connection = ds.getConnection();
return connection;
} catch (Exception exception) {
exception.printStackTrace();
}
}
循环内,所以while
不断增加。
最好的解决方法是什么?
编辑:PostgresConnectionPool.pool.Wait
是池名称。池PostgresConnection
来自Dropwizard指标:
https://github.com/brettwooldridge/HikariCP/wiki/Dropwizard-Metrics