본문 바로가기

전체보기/Spring

[Spring Boot]HikariCP 모니터링 - InstanceAlreadyExistsException 해결

지난 글에서는 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

 

반응형