You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot获取Hikari Pool活跃连接报InstanceNotFoundException问题咨询

问题1解答:HikariPool-1不是实际池名的排查方向

  • 首先你报错的核心原因是Hikari默认没有开启JMX MBean注册,所以MBeanServer中根本不存在对应实例,和池名是否正确无关。需要先在配置中开启注册:
    单数据源配置示例(application.properties):
    spring.datasource.hikari.register-mbeans=true
    # 可选:自定义池名,不配置默认按HikariPool-1、HikariPool-2递增命名
    spring.datasource.hikari.pool-name=business-pool
    
    多数据源场景下需要给每个数据源的Hikari单独配置register-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:57:04