티스토리 뷰
spring cloud config 사용시 The configuration of the pool is sealed once started. Use HikariConfigMXBean for runtime changes. 에러
LichKing 2018. 12. 6. 20:53spring 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 설정을 하는것이다.
|
해당 PR을 거절하면서 Hikari 하나를 위해서 javax.sql.DataSource 를 코드에 추가할수는 없다는 이유를 말했는데 납득은 가나 Spring boot 2 의 기본 cp 라이브러리가 Hikari 인걸 생각하면 나중에라도 뭔가 다른 방법이 나오지않을까 싶다.(문서에 명확히 명시해주거나)
'Java > spring' 카테고리의 다른 글
Spring Cloud Config 2 (1) | 2018.12.08 |
---|---|
Spring Cloud Config 1 (0) | 2018.12.07 |
Spring DI (3) | 2018.01.21 |
Spring Bean 초기화/소멸 (0) | 2017.11.17 |
static factory method를 이용한 spring bean 생성 (4) | 2017.11.16 |
- Total
- Today
- Yesterday
- Jackson
- toby
- OOP
- JPA
- TEST
- go-core
- java8
- backend개발환경
- 정규표현식
- java
- EffectiveJava
- generics
- frontcode
- Spring
- javascript
- MySQL
- clean code
- code
- http
- servlet
- Kotlin
- db
- frontend개발환경
- Git
- Design Pattern
- DesignPattern
- programming
- JavaScript Core
- mariadb
- spring cloud
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |