Spring Boot获取Hikari Pool活跃连接报InstanceNotFoundException问题咨询
问题1解答:HikariPool-1不是实际池名的排查方向
- 首先你报错的核心原因是Hikari默认没有开启JMX MBean注册,所以MBeanServer中根本不存在对应实例,和池名是否正确无关。需要先在配置中开启注册:
单数据源配置示例(application.properties):
多数据源场景下需要给每个数据源的Hikari单独配置spring.datasource.hikari.register-mbeans=true # 可选:自定义池名,不配置默认按HikariPool-1、HikariPool-2递增命名 spring.datasource.hikari.pool-name=business-poolregister-mbeans=true。 - 如果开启配置后仍报错,可以遍历所有已注册的Hikari MBean确认实际池名:
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); Set<ObjectName> hikariPools = mBeanServer.queryNames(new ObjectName("com.zaxxer.hikari:type=Pool,*"), null); for (ObjectName poolName : hikariPools) { System.out.println("已注册Hikari池:" + poolName.getKeyProperty("name")); }
问题2解答:无需指定池名获取所有连接池的实现
推荐两种方案,第二种不需要依赖JMX配置,稳定性更高:
方案1:JMX遍历实现
无需提前知道池名,直接遍历所有Hikari域的MBean即可:
@Slf4j @Component public class HikariPoolInfoContributor implements InfoContributor { @Override public void contribute(Info.Builder builder) { Map<String, Integer> poolActiveMap = new HashMap<>(); try { MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); Set<ObjectName> hikariPools = mBeanServer.queryNames(new ObjectName("com.zaxxer.hikari:type=Pool,*"), null); for (ObjectName pool : hikariPools) { String poolName = pool.getKeyProperty("name"); Integer activeConn = (Integer) mBeanServer.getAttribute(pool, "ActiveConnections"); poolActiveMap.put(poolName, activeConn); } } catch (Exception e) { log.error("获取连接池指标失败", e); } builder.withDetail("hikariActiveConnections", poolActiveMap).build(); } }
方案2:直接从Spring上下文获取HikariDataSource实例(更推荐)
不需要开启JMX配置,直接获取所有Hikari数据源Bean读取指标即可:
@Slf4j @Component @RequiredArgsConstructor public class HikariPoolInfoContributor implements InfoContributor { private final ApplicationContext applicationContext; @Override public void contribute(Info.Builder builder) { Map<String, Integer> poolActiveMap = new HashMap<>(); Map<String, HikariDataSource> dataSourceMap = applicationContext.getBeansOfType(HikariDataSource.class); dataSourceMap.forEach((beanName, dataSource) -> { HikariPoolMXBean poolMXBean = dataSource.getHikariPoolMXBean(); poolActiveMap.put(dataSource.getPoolName(), poolMXBean.getActiveConnections()); }); builder.withDetail("hikariActiveConnections", poolActiveMap).build(); } }
内容的提问来源于stack exchange,提问作者R0b1n
相关产品推荐
相关产品推荐

