본문 바로가기
개발/Cloud

spring cloud config 사용시 The configuration of the pool is sealed once started. Use HikariConfigMXBean for runtime changes. 에러

by 카루딘 2019. 10. 12.
반응형

출처: https://multifrontgarden.tistory.com/235?category=644080 [우리집앞마당]

 

 

 

spring cloud config client를 사용하여 갱신된 config 정보를 받아오기위해선 /actuator/refresh 를 호출해야한다. 그런데 이때 전혀 신경도 쓰지않았던 Hikari 에서 예외가 발생하는 경우가 있다.

 

java.lang.IllegalStateException: The configuration of the pool is sealed once started.  Use HikariConfigMXBean for runtime changes. 

 

이런 에러메세지가 나오는데 정확히 파본건 아니지만 refresh 를 하면서 config들을 갱신할때 Hikari 쪽을 호출하는듯 하다. 이것도 확인해본건 아니지만 아래처럼 @ConfigurationProperties 애노테이션을 사용해서 생성할때만 에러가 날듯 하다.

 

@ConfigurationProperties(prefix = "datasource")

@Bean(name = "dataSource")

public DataSource dataSource() {

return DataSourceBuilder.create().build();

}

 

뭐 여튼 이 문제를 해결하는 방법은 3가지 정도가있다.

 

1. @RefreshScope

DataSource 설정부분에 @RefreshScope 애노테이션을 붙인다. 애노테이션을 붙이면 Hikari도 refresh 가 가능해진다. 아래에 이어갈 2, 3번 방법도 궁극적으론 다 똑같은 해결책을 다른방법으로 제시한 내용들이다.

 

2. HikariDataSource

DataSource 반환타입을 HikariDataSource로 구체화시켜준다. RefreshAutoConfiguration.java 클래스를 보면 이런 내용이 있다.

 

private Set<String> refreshables = new HashSet<>(

Arrays.asList("com.zaxxer.hikari.HikariDataSource"));

 

저 타입에 맞춰주면 에러는 뜨지않게된다. 보통 인터페이스로 쓰기에 위쪽에 있는 코드처럼 javax.sql.DataSource 을 반환타입으로 지정하게되는데 구체적으로 HikariDataSource 로 명시하면 된다. 3번이 없으면 이 방법을 썼었을텐데 3번이 있어서 난 이방법은 쓰지않았다. 타입명시는 이런식으로 해주면 된다.

 

return DataSourceBuilder.create().type(HikariDataSource.class).build();

 

3. config

2번 방법에 있는 List 안에 javax.sql.DataSource 를 넣는 PR을 이미 누군가 올렸다.

https://github.com/spring-cloud/spring-cloud-commons/pull/395 )

 

그런데 그 PR은 거절당했는데 대안으로 알려준 방법이 config 설정을 하는것이다.

 

spring.cloud.refresh.extra-refreshable=javax.sql.DataSource 

 

해당 PR을 거절하면서 Hikari 하나를 위해서 javax.sql.DataSource 를 코드에 추가할수는 없다는 이유를 말했는데 납득은 가나 Spring boot 2 의 기본 cp 라이브러리가 Hikari 인걸 생각하면 나중에라도 뭔가 다른 방법이 나오지않을까 싶다.(문서에 명확히 명시해주거나)

 

 

반응형