Hikari は Spring Boot のデフォルトのデータベース接続プールです。接続プール オブジェクトを通じてさまざまなステータス インジケーターを直接取得する C3P0 とは異なり、Hikari は JMX を通じてステータス インジケーターを取得する必要があります。デモは次のとおりで、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 で次のような問題が言及されています:
ObjectName poolName = new ObjectName("com.zaxxer.hikari:type=Pool (" + hikaridatasource.getPoolName() + ")");
はエラーをスローする可能性があります
22:06:23.231 [ main] デバッグ com.zaxxer.hikari.HikariConfig - ドライバー クラス com.mysql.cj.jdbc.Driver がスレッド コンテキスト クラス ローダーで見つかりました sun.misc.Launcher$AppClassLoader@73d16e93
スレッド "main" java.lang で例外が発生しました.reflect.UndeclaredThrowableException
com.sun.proxy.$Proxy2.getIdleConnections(Unknown Source)
com.zte.hikariTest.HikariTest.main(HikariTest.java:32)
原因: javax。 Management .InstanceNotFoundException: com.zaxxer.hikari:type=Pool (foo)
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(Unknown Source)
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getAttribute ( ソース不明)
com.sun.jmx.mbeanserver.JmxMBeanServer.getAttribute(ソース不明)
com.sun.jmx.mbeanserver.MXBeanProxy$GetHandler.invoke(ソース不明)
com. sun .jmx.mbeanserver.MXBeanProxy.invoke(Unknown Source)
at javax.management.MBeanServerInvocationHandler.invoke(Unknown Source)
... 2 more
これは、Hikari が設定しているためです。また、setHikariConfig と設定ファイルの 2 つの設定方法をサポートしていますので、両方を併用するのではなく、どちらか一方を選択して設定してください。また、次のようにプロパティを設定してください。そうしないと、JMX が有効になりません。
hikaridatasource.setRegisterMbeans(true);
コードの効果は次のとおりです
2019-03-09 02:05:04.738 INFO com.zte.hikariTest.HikariTest.69 -HikariPoolState = アクティブ =[1] アイドル =[9] 待機 =[0] 合計 =[10]
2019-03-09 02:05:05.740 情報 com.zte.hikariTest.HikariTest.69 -HikariPoolState = Active=[ 1 ] アイドル = [9] 待機 = [0] 合計 = [10]
2019-03-09 02:05:06.732 情報 com.zte.hikariTest.HikariTest.69 -HikariPoolState = Active=[1] Idle= [ 9] 待機 =[0] 合計 =[10]
2019-03-09 02:05:07.738 情報 com.zte.hikariTest.HikariTest.69 -HikariPoolState = Active=[1] Idle=[9] 待機= [0] 合計 = [10]
以上がSpringBootを使用してHikari接続プールを実装し、JMX監視を構成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。