java - SpringBoot 2 - 监控数据库连接

标签 java spring-boot jdbc 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 支持两种不同的配置模式:
1) 通过 HikariConfig 类进行配置
2) 直接配置 HikariDataSource
SpringBoot 使用的是第二个选项。
我在过去尝试过配置 HikariCP(无 SpringBoot)的第一个选项,它正在注册 PoolPoolConfig Beans.... Pool bean是我感兴趣的连接用法。

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

谢谢。

最佳答案

要获取“由 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 = new HikariDataSource(config);

关于java - SpringBoot 2 - 监控数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50770462/

相关文章:

java - 从 Spring Boot 1.5 迁移到 2,多个数据源上出现错误

mysql - 建议一种在 JavaFX 中删除所有表并使 MySQL 数据库为空的方法

java - 如何启用 Yandex 翻译 API?

java - 就性能而言,在什么时候用 BufferedOutputStream 包装 FileOutputStream 才有意义?

java - 正则表达式中数字的重叠测试?

java - WebSecurityConfigurerAdapter 配置重叠权限

java - 如何为这堆for循环指定一个通用公式来减少代码?

java - Hibernate @OneToOne 不映射 id

java - 'where clause' 中未知的列用户名

java - 使用 Prepared Statement 设置 LONG 数据类型