SpringBoot 2 - 监控数据库连接

时间:2018-06-09 02:43:59

标签: spring-boot hikaricp

我在SprintBoot 2上配置了数据库连接(HikariCP)。 我在 application.properties

中定义了poolName
spring.datasource.hikari.poolName=HikariConnectionPool

我想监视空闲数据库连接的数量,所以我尝试创建一个监视数据库连接的线程:

public class HikariCPStatistics implements Runnable {

    public static final Logger logger = LoggerFactory.getLogger(HikariCPStatistics.class);

    private static HikariPoolMXBean poolProxy;

    public HikariCPStatistics() {
            MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
            try {
                    ObjectName poolName = new ObjectName("com.zaxxer.hikari:type=Pool (HikariConnectionPool)");
                    poolProxy = JMX.newMXBeanProxy(mBeanServer, poolName, HikariPoolMXBean.class);

            } catch (MalformedObjectNameException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
            }
    }

    @Override
    public void run() {
            logger.info("Starting Connection Pool status monitor");
            while ( true ) {
                    logger.info("Hikari - Idle Connections: " + poolProxy.getIdleConnections());
                    try {
                            Thread.sleep(5000);
                    } catch (InterruptedException e) {
                            logger.error("Fail to run Connection Pool status monitor");
                            e.printStackTrace();
                    }
            }

    }

}

但是我得到一个例外,它无法找到poolName HikariConnectionPool 的实例。 关于如何获得由HikariCP管理的空闲数据库连接的任何建议?

进一步分析,我可以看到SpringBoot实际上并没有在JMX中注册 Pool bean。 SpringBoot只在JMX中发布 HikariDataSource bean,它具有Hikari dataSource的静态配置。 从我所看到的,Hikari支持2种不同的配置模式:
1)配置虽然HikariConfig类
2)直接配置HikariDataSource
SpringBoot正在使用第二个选项 我在过去尝试过配置HikariCP(没有SpringBoot)的第一个选项,它注册了 Pool PoolConfig Beans .... Pool bean是我感兴趣的具有连接用途的那个。

有没有人知道如何在SpringBoot中配置选项(1 - HikariConfig类)设置HikariDataSource?或者以某种方式springboot创建 Bean?

感谢。

3 个答案:

答案 0 :(得分:0)

您可以从注入HikariDataSource的Hikari连接池中获取大量信息。即使是列表。

private final List<HikariDataSource> hikariConfigMXBeans;

infos like name = hikariDataSource.getPoolName();
idleTimeout = hikariDataSource.getIdleTimeout();
validationTimeout = hikariDataSource.getValidationTimeout();
connectionTimeout = hikariDataSource.getConnectionTimeout();
leakDetectionThreshold = hikariDataSource.getLeakDetectionThreshold();
maxLifetime = hikariDataSource.getMaxLifetime();
minimumIdle = hikariDataSource.getMinimumIdle();
maxPoolSize = hikariDataSource.getMaximumPoolSize();

从这里可以轻松创建一个执行器端点来显示此信息。

希望这是您需要监控的信息

答案 1 :(得分:0)

要获取由HikariCP管理的空闲数据库连接,请首先获取Spring Boot使用的HikariPool

HikariPool hikariPool = (HikariPool) new DirectFieldAccessor(getDataSource()).getPropertyValue("pool");

然后使用HikariPool方法获取当前的空闲连接状态:

hikariPool.getIdleConnections();

有关通过HikariConfig进行初始化的信息,请参见Hikari's initialization

  

HikariConfig config = new HikariConfig();

     

config.setJdbcUrl(“ jdbc:mysql:// localhost:3306 / simpsons”);

     

config.setUsername(“ bart”);

..

  

HikariDataSource ds =新的HikariDataSource(config);

答案 2 :(得分:0)

这就是我监视连接池的方式

        HikariPool hikariPool = (HikariPool)
                new DirectFieldAccessor(dataSource).getPropertyValue("pool");

        //Getting pool connection info
        logger.info(" hikariPool getActiveConnections : " + hikariPool.getActiveConnections());
        logger.info(" hikariPool getTotalConnections : " + hikariPool.getTotalConnections());
        logger.info(" hikariPool getIdleConnections : " + hikariPool.getIdleConnections());
        logger.info(" hikariPool getThreadsAwaitingConnection : " + hikariPool.getThreadsAwaitingConnection());

        //Getting maximum pool size - set from properties
        Integer t= new HikariDataSourcePoolMetadata((HikariDataSource) dataSource).getMax();
        logger.info(" hikariPool Maximum Pool Size : " + t.toString());