如何在Spring Boot应用程序中使用JMX MBean来管理HikariCP?

8

如何在Spring Boot应用程序中使用JMX MBean以支持HikariCP?我有这样的代码:

@SpringBootApplication
public class App() { ... }

其他类:

@Configuration
public class DatabaseCfg() {
@Bean
@ManagedOperation
public DataSource ds (@Value("${hikari.proprerties}") String config) {
HikariConfig hikariConfig = new HikariConfig(config);
return new HikariDataSource(hikariConfig);
}

在Java Mission Control(或JMX控制台)中,只能看到DataSource托管的Bean,而没有HikariCP的JMX MBean(参考链接:link)。是否有可能也添加进去?


什么也不要做。你试图比Spring Boot更聪明,相反地,请与框架一起工作。只需让Spring Boot配置数据源(它将自动完成此操作,只需在application.properties中添加适当的依赖项和设置即可。) - M. Deinum
3个回答

7
在Spring Boot 2.0+中,您可以在application.properties文件中设置register-mbeans属性。
spring.datasource.hikari.register-mbeans = true

如果您使用的是早期版本的Spring Boot,则还必须设置数据源。

spring.datasource.type = com.zaxxer.hikari.HikariDataSource 

1

我认为在你的hikariConfig中,你需要设置一些额外的配置。你需要注册MBeans并在配置中设置一个池名称。

HikariConfig hiakriConfig = new HikariConfig(config);
hikariConfig.setRegisterMbeans(true);
kikariConfig.setPoolName("my-pool-1");

显然,您也可以通过属性驱动它们。我不确定您是否将它们包含在属性文件中,因为它们未列出。另请注意,您的拼写错误了(@Value("${ds.proprerties}") 应该是 (@Value("${ds.properties}"),但我不确定您实际上如何命名变量和属性文件。您可能需要仔细检查是否要在那里设置所有属性。


谢谢!但是它没有起作用。 ds.properties被重命名为hikari.properties,以免误导。所有属性都从该文件中读取,没有问题。 至于代码 hikariConfig.setRegisterMbeans(true); 当您启动应用程序时,会抛出此bean已经注册的异常,因为在Spring Boot中默认启用了JMX(@SpringBootApplication注释)。 - BlackJonnie

0

可以试试这个。在Spring中排除你的Hiakri DataSource Bean的注册。

@Resource
private ObjectProvider<MBeanExporter> mBeanExporter;

@Bean("dataSource")
public DataSource createDataSource() {
    String url = hikariDataSourceConfig.getUrl();
    String username = hikariDataSourceConfig.getUsername();
    String password = hikariDataSourceConfig.getPassword();
    long idleTimeoutInMilliSeconds =
            hikariDataSourceConfig.getIdleTimeOutInMilliseconds();
    long maxLifetimeInMilliseconds =
            hikariDataSourceConfig.getMaxLifetimeInMilliseconds();
    int maximumPoolSize = hikariDataSourceConfig.getMaximumPoolSize();
    int minimumIdle = hikariDataSourceConfig.getMinimumIdle();
    String poolName = "HikariDataSource";
    HikariConfig hikariConfig = new HikariConfig();
    hikariConfig.setRegisterMbeans(true);
    hikariConfig.setJdbcUrl(url);
    hikariConfig.setUsername(username);
    hikariConfig.setPassword(password);
    hikariConfig.setIdleTimeout(idleTimeoutInMilliSeconds);
    hikariConfig.setMaxLifetime(maxLifetimeInMilliseconds);
    hikariConfig.setMaximumPoolSize(maximumPoolSize);
    hikariConfig.setMinimumIdle(minimumIdle);
    hikariConfig.setPoolName(poolName);
    HikariDataSource dataSource = new HikariDataSource(hikariConfig);
    mBeanExporter
            .ifUnique((exporter) -> exporter.addExcludedBean("dataSource"));
    return dataSource;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接