本篇內容主要講解“如何實現(xiàn)Hikari連接池使用SpringBoot配置JMX監(jiān)控”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何實現(xiàn)Hikari連接池使用SpringBoot配置JMX監(jiān)控”吧!
創(chuàng)新互聯(lián)公司專注于白銀區(qū)企業(yè)網(wǎng)站建設,響應式網(wǎng)站,商城建設。白銀區(qū)網(wǎng)站建設公司,為白銀區(qū)等地區(qū)提供建站服務。全流程按需設計,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務Hikari是Spring Boot默認的數(shù)據(jù)庫連接池。區(qū)別于C3P0直接通過連接池對象獲取各項狀態(tài)指標,Hikari需要通過JMX來獲取。Demo如下,采用Spring Boot集成,定時采集連接狀態(tài)。
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設置參數(shù)同樣支持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]
到此,相信大家對“如何實現(xiàn)Hikari連接池使用SpringBoot配置JMX監(jiān)控”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)建站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!