7

I was trying to log the number of current active connections. I am using com.zaxxer.hikari.HikariJNDIFactory as my data source factory.

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());

But it is throwing the following exception:

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)

Where HikariConnectionCount.java is the file I have written

TheLethalCoder
  • 6,668
  • 6
  • 34
  • 69
Vikranth
  • 71
  • 1
  • 1
  • 2

2 Answers2

8

Programatic access is documented here https://github.com/brettwooldridge/HikariCP/wiki/MBean-(JMX)-Monitoring-and-Management

brettw
  • 10,664
  • 2
  • 42
  • 59
3

Here's a dirty recipe:

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();
    }
}

Use it thus:

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);
    }
leonbloy
  • 73,180
  • 20
  • 142
  • 190