출처: 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 인걸 생각하면 나중에라도 뭔가 다른 방법이 나오지않을까 싶다.(문서에 명확히 명시해주거나)
'개발 > Cloud' 카테고리의 다른 글
Netflix Hystrix (0) | 2019.10.12 |
---|---|
Spring Cloud Config 2 (0) | 2019.10.12 |
Spring Cloud Config 1 (0) | 2019.10.12 |
Spring Cloud Gateway 2.1.0RELEASE 레퍼런스 (0) | 2019.10.10 |
Spring에서 Client Authentication (two-way TLS/SSL) 구현하기출처: https://springboot.cloud/20?category=674395 [갓.바.조.아] (0) | 2019.10.10 |