【问题标题】:InstanceNotFoundException when trying to get Hikari Pool active connections in Spring boot尝试在 Spring Boot 中获取 Hikari Pool 活动连接时出现 InstanceNotFoundException
【发布时间】:2021-11-03 00:39:27
【问题描述】:

我正在尝试获取 Spring-boot Hikari 池中的活动连接数。在我的日志中,它打印了两个名为 HikariPool-1HikariPool-2 的池。

@Slf4j
@RequiredArgsConstructor
public class HikariJmxElf {
    private final ObjectName poolAccessor;
    private final MBeanServer mBeanServer;

    public HikariJmxElf(final String poolName) {
        try {
            mBeanServer = java.lang.management.ManagementFactory.getPlatformMBeanServer();
            poolAccessor = new ObjectName("com.zaxxer.hikari:type=Pool (" + poolName + ")");
        } catch (MalformedObjectNameException e) {
            throw new RuntimeException("Pool " + poolName + " could not be found", e);
        }
    }

    public int getIdleConnections() {
        try {
            return (Integer) mBeanServer.getAttribute(poolAccessor, "IdleConnections");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public int getActiveConnections() {
        try {
            return (Integer) mBeanServer.getAttribute(poolAccessor, "ActiveConnections");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public int getTotalConnections() {
        try {
            return (Integer) mBeanServer.getAttribute(poolAccessor, "TotalConnections");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}

我正在尝试使用执行器信息端点获取该数据。

@Slf4j
@Component
@RequiredArgsConstructor
public class HikariPoolInfoContributor implements InfoContributor {
    @Override
    public void contribute(Info.Builder builder) {
        builder
            .withDetail("connectionDetails", new HikariJmxElf("HikariPool-1").getActiveConnections())
            .build();
    }
}

我得到的完整错误是

java.lang.RuntimeException: javax.management.InstanceNotFoundException: com.zaxxer.hikari:type=Pool (HikariPool-1)

我有这些问题。

  1. mBeanServer 服务器需要一个带有池名称的对象名称。 HikariPool-1 不是 if 的实际名称吗?
  2. 有没有一种方法可以让所有 Hikari 池不使用名称?

【问题讨论】:

    标签: java spring-boot spring-boot-actuator hikaricp


    【解决方案1】:

    访问令牌过期后,我们可以通过向与上述相同的 URL 发送 POST 请求来刷新它,但包含刷新令牌而不是用户名和密码:

    请查看以下链接。

    https://www.baeldung.com/spring-boot-keycloak

    【讨论】:

    • 这与 Spring Boot 安全性无关,因为我使用的是执行器信息。该行引发了该异常。 -- return (Integer) mBeanServer.getAttribute(poolAccessor, "ActiveConnections");
    • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
    最近更新 更多