如何在Spring启动应用程序中使用JMX MBean for 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)。是否可以添加它?
答案 0 :(得分:1)
我相信你的hikariConfig你需要设置一些额外的设置。您需要注册MBean并在配置上设置池名称。
HikariConfig hiakriConfig = new HikariConfig(config);
hikariConfig.setRegisterMbeans(true);
kikariConfig.setPoolName("my-pool-1");
是的,你显然也可以通过这些物业开车。我不确定您是否将这些内容包含在您的属性文件中,因为它们未列出。另请注意,拼写属性错误(@Value(" $ {ds.proprerties}")应该应该是(@Value(" $ {ds.properties}")但是我不确定你实际上是如何命名变量和属性文件的。你可能想要仔细检查是否要设置所有属性。
答案 1 :(得分:0)
尝试一下。排除您的Hiakri DataSource Bean被Spring注册。
@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;
}