Hikari是Spring Boot默认的数据库连接池。区别于C3P0直接通过连接池对象获取各项状态指标,Hikari需要通过JMX来获取。Demo如下,采用Spring Boot集成,定时采集连接状态。
public static void main(String[] args) throws SQLException, MalformedObjectNameException, InterruptedException {
SpringApplication.run(HikariTest.class, args);
HikariDataSource hikaridatasource = new HikariDataSource();
hikaridatasource.setJdbcUrl("jdbc:mysql://localhost:3306?serverTimezone=GMT");
hikaridatasource.setUsername("root");
hikaridatasource.setPassword("");
hikaridatasource.setDriverClassName("com.mysql.cj.jdbc.Driver");
hikaridatasource.setRegisterMbeans(true);
hikaridatasource.setPoolName("HikariConnectionPool");
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName poolName = new ObjectName("com.zaxxer.hikari:type=Pool (" + hikaridatasource.getPoolName() + ")");
poolProxy = JMX.newMXBeanProxy(mBeanServer, poolName, HikariPoolMXBean.class);
Connection conn = hikaridatasource.getConnection();
Statement sm = conn.createStatement();
ResultSet rs = null;
for (int i = 0; i < 999999999; i++) {
rs = sm.executeQuery("select name from test.t1");
}
rs.close();
sm.close();
conn.close();
hikaridatasource.close();
}
@Scheduled(fixedRate = 1000)
public void HikariMonitor() {
if(poolProxy == null) {
log.info("Hikari not initialized,please wait...");
}else {
log.info("HikariPoolState = "
+ "Active=[" + String.valueOf(poolProxy.getActiveConnections() + "] "
+ "Idle=[" + String.valueOf(poolProxy.getIdleConnections() + "] "
+ "Wait=["+poolProxy.getThreadsAwaitingConnection()+"] "
+ "Total=["+poolProxy.getTotalConnections()+"]")));
}
}另外,在github有提到这样的issue:
ObjectName poolName = new ObjectName("com.zaxxer.hikari:type=Pool (" + hikaridatasource.getPoolName() + ")");可能会抛错
22:06:23.231 [main] debug com.zaxxer.hikari.hikariconfig - driver class com.mysql.cj.jdbc.driver found in thread context class loader sun.misc.launcher$appclassloader@73d16e93
exception in thread "main" java.lang.reflect.undeclaredthrowableexception
at com.sun.proxy.$proxy2.getidleconnections(unknown source)
at com.zte.hikaritest.hikaritest.main(hikaritest.java:32)
caused by: javax.management.instancenotfoundexception: com.zaxxer.hikari:type=pool (foo)
at com.sun.jmx.interceptor.defaultmbeanserverinterceptor.getmbean(unknown source)
at com.sun.jmx.interceptor.defaultmbeanserverinterceptor.getattribute(unknown source)
at com.sun.jmx.mbeanserver.jmxmbeanserver.getattribute(unknown source)
at com.sun.jmx.mbeanserver.mxbeanproxy$gethandler.invoke(unknown source)
at com.sun.jmx.mbeanserver.mxbeanproxy.invoke(unknown source)
at javax.management.mbeanserverinvocationhandler.invoke(unknown source)
... 2 more
这是因为Hikari设置参数同样支持setHikariConfig和配置文件两种配置方式,请选择其中一种进行配置,而不是二者一起使用。并且请配置属性如下,否则 JMX 无法生效。
hikaridatasource.setRegisterMbeans(true);
代码效果如下所示
2019-03-09 02:05:04.738 INFO com.zte.hikariTest.HikariTest.69 -HikariPoolState = Active=[1] Idle=[9] Wait=[0] Total=[10]
2019-03-09 02:05:05.740 INFO com.zte.hikariTest.HikariTest.69 -HikariPoolState = Active=[1] Idle=[9] Wait=[0] Total=[10]
2019-03-09 02:05:06.732 INFO com.zte.hikariTest.HikariTest.69 -HikariPoolState = Active=[1] Idle=[9] Wait=[0] Total=[10]
2019-03-09 02:05:07.738 INFO com.zte.hikariTest.HikariTest.69 -HikariPoolState = Active=[1] Idle=[9] Wait=[0] Total=[10]
以上就是如何实现Hikari连接池使用SpringBoot配置JMX监控的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号