多线程Java应用程序中的连接池

时间:2019-03-13 17:06:13

标签: java multithreading connection-pooling hikaricp

我正在开发一个始终运行约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

0 个答案:

没有答案