지난 글에서는 MBean을 이용해 HikariCP의 상태를
모니터링하는 방법에 대해 다뤄봤습니다.
( [Spring Boot]HikariCP 모니터링 )
하지만 회사에서 서비스 중인 프로젝트에 적용하려고 하니
다음과 같은 문제가 발생하였습니다.
내용을 살펴보니 MXBean이 이미 등록되었다고 합니다.
본격적으로 원인을 알아보기 전에 코드를 살펴보겠습니다.
Configuration
//DatasourceConfig.java
@Bean
public HikariPoolMXBean poolProxy() throws MalformedObjectNameException {
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName("com.zaxxer.hikari:type=Pool (hikari)");
return JMX.newMBeanProxy(mBeanServer, objectName, HikariPoolMXBean.class);
}
@ConfigurationProperties(prefix = "sample")
@Bean("sampleDataSource")
public DataSource dataSource(){
return DataSourceBuilder.create().build();
}
application.properties
sample.jdbc-url=jdbc:mysql://localhost:3306/hikari?serverTimezone=UTC
sample.driver-class-name=com.mysql.cj.jdbc.Driver
sample.username=root
sample.password=mysqlpassword
sample.register-mbeans=true
sample.pool-name=hikari
위 코드는 동일한 현상이 발생할 수 있도록 작성한 예제 코드입니다.
결론부터 말하자면 해당 문제는 Spring Framework에서
기본적으로 모든 Spring Bean을 MBean으로 등록하기 때문에 발생한 문제입니다.
과정을 조금 더 자세하게 설명하면 다음과 같습니다.
위에서 sampleDataSource라는 Bean을 생성하면서
Spring은 해당 Bean을 MBean으로 등록합니다.
이후에 우리가 Connection을 생성하면서
HikariPool MBean과 sampleDataSource MBean을 등록하게 되고
여기서 위 문제가 발생하는 것 입니다.
위 문제를 해결하는 방법 중 하나는
Spring이 모든 Bean을 MBean으로 등록하지 못하도록 하는 것입니다.
이를 위해서 application.properties에 다음과 같은 설정을 추가합니다.
spring.jmx.enabled=false
Intellij에서 어플리케이션을 실행할 경우 추가로
Run > Edit Configuration에서 Enable JMX agent를 해제시켜 줍니다.
Reference
반응형
'전체보기 > Spring' 카테고리의 다른 글
[JPA] JpaRepository vs CrudRepository(1) - Paging과 Sorting / QueryExampleExecutor (0) | 2022.01.01 |
---|---|
[Spring Boot] DateTime 다뤄보기(3) - Database에 저장하기 (0) | 2021.07.06 |
[Spring Boot] DateTime 다뤄보기 (0) | 2021.06.02 |
[Spring Boot] Custom Constraint / Validation 파헤치기 (0) | 2020.08.26 |
[Spring Boot]HikariCP 모니터링 (0) | 2020.07.10 |