如何获取HikariCP的活动连接数

时间:2016-11-24 11:15:07

标签: hikaricp

我试图记录当前活动连接的数量。我使用com.zaxxer.hikari.HikariJNDIFactory作为我的数据源工厂。

final Context context = new InitialContext();
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDataSource((DataSource) ((Context)context.lookup("java:comp/env")).lookup("jdbc/mydb"));
HikariPool hikariPool = new HikariPool(hikariConfig);
LOGGER.log(Level.INFO, "The count is ::" + hikariPool.getActiveConnections());

但它抛出以下异常:

java.lang.RuntimeException: java.lang.NullPointerException
        at com.zaxxer.hikari.util.PoolUtilities.createInstance(PoolUtilities.java:105)
        at com.zaxxer.hikari.metrics.MetricsFactory.createMetricsTracker(MetricsFactory.java:34)
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:131)
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:99)
        at com.something.servlet.HikariConnectionCount.doGet(HikariConnectionCount.java:35)

HikariConnectionCount.java是我写的文件

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:0)

这是一个肮脏的食谱:

import org.springframework.beans.DirectFieldAccessor;    
import com.zaxxer.hikari.HikariDataSource;
import com.zaxxer.hikari.pool.HikariPool;

public class HikariDataSourcePoolDetail {

    private final HikariDataSource dataSource;

    public HikariDataSourcePoolDetail(HikariDataSource dataSource) {
        this.dataSource = dataSource;
    }

    public HikariPool getHikariPool() {
        return (HikariPool) new DirectFieldAccessor(dataSource).getPropertyValue("pool");
    }

    public int getActive() {
        try {
            return getHikariPool().getActiveConnections();
        } catch (Exception ex) {
            return -1;
        }
    }

    public int getMax() {
        return dataSource.getMaximumPoolSize();
    }
}

这样使用它:

try {
        HikariDataSourcePoolDetail dsd = new HikariDataSourcePoolDetail((HikariDataSource)dataSource);
        log.info("HikariDataSource details: max={} active={}", dsd.getMax(), dsd.getActive());
    } catch (Exception e) {
        log.error("HikariDataSourcePoolDetail failed: ", e);
    }