SpringBoot 2 - 监控数据库连接

Hel*_*oto 2 java jdbc spring-boot hikaricp

我在 SprintBoot 2 上配置了一个数据库连接(HikariCP)。我在application.properties 中定义了 poolName :

spring.datasource.hikari.poolName=HikariConnectionPool
Run Code Online (Sandbox Code Playgroud)

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

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

    }
Run Code Online (Sandbox Code Playgroud)

}

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


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

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

谢谢。

use*_*900 5

获取 HikariCP 管理的空闲 DB 连接,首先获取Spring Boot使用的 HikariPool

HikariPool hikariPool = (HikariPool) new DirectFieldAccessor(getDataSource()).getPropertyValue("pool");
Run Code Online (Sandbox Code Playgroud)

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

hikariPool.getIdleConnections();
Run Code Online (Sandbox Code Playgroud)

由 HikariConfig 初始化见Hikari 的初始化

HikariConfig config = new HikariConfig();

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

config.setUsername("bart");

..

HikariDataSource ds = new HikariDataSource(config);