티스토리 뷰
부제: hibernate auto reconnect, spring boot JPA reconnect, org.hibernate.exception.jdbcconnectionexception could not prepare statement 문제 해결
Spring Boot + JPA + Hibernate로 MySQL을 연동하여 웹 앱을 구현했는데, 아래와 같은 문제가 발생했다.
구글링을 해보니, Mysql의 Connection Pipe(?)가 끊어진 것이다. 쉽게 말하면 연결을 잃어버린 것인데, Mysql의 경우 8시간 이상 요청이 없으면 연결을 끊어버린다고 한다.
내 앱을 쓰는 사람이 많은 것도 아니고, 밤에 자고 일어나는 것 감안하면 8시간은 너무 짧았다. 대책이 필요하다고 생각하여, 방법을 찾아봤는데 가장 간단하게 해결할 수 있는 법이
접속 URL에 autoReconnection 옵션을 추가하는 것
이다. 예를 들면 아래와 같다.
1 | spring.datasource.url = jdbc:mysql://localhost:3306/test?autoReconnect=true | cs |
하지만, 이 방법은 좋지 않은 방식이라고 한다. Connection을 갱신하는 동안 요청이 들어올 경우, 오류가 발생할 수 있기에 불안정하므로 다른 방식을 사용하는 것이 좋다.
나는 그 다음 방식으로 Spring boot의 Properties 파일을 활용하여 설정하기로 했다. 아래의 예제를 application.properties 파일에 추가하자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | spring.datasource.tomcat.max-active=10 // 최대 connection 개수 spring.datasource.tomcat.initial-size=2 // 초기화 connection 개수 spring.datasource.tomcat.max-idle=2 // idle 상태의 connection 최대 개수 spring.datasource.tomcat.min-idle=1 // idle 상태의 connection 최소 개수 // true로 주면, idle 상태에서도 test를 실행함 spring.datasource.tomcat.test-while-idle=true // idle 상태가 얼마나 지속되면 test를 실행할 것인지. mil값임. spring.datasource.tomcat.time-between-eviction-runs-millis=3600000 // connection의 유효기간. spring.datasource.tomcat.min-evictable-idle-time-millis=7200000 // connection을 가져올 때, test 할것인지 여부 spring.datasource.tomcat.testOnBorrow=true // test QUERY spring.datasource.tomcat.validationQuery=SELECT 1 | cs |
다른 블로그에서 적절한 설명까지 참조해 곁들였으니, 쉽게 이해할 수 있을 것이다. 잘보면 'tomcat'이라는 키워드가 들어있는데, 이는 Spring boot 1.4부터 지원하는 내용이므로 주의한다.
만약 Spring Boot 1.3 이하를 사용하고 있다면 해당 키워드('tomcat')는 빼야하고, 1.4 이상이라면 자신이 어떤 jdbc를 쓰고있는지에 따라 tomcat, dbcp, dbcp2 등으로 지정하여 설정할 수 있다.
-끝-
출처 및 참고
https://stackoverflow.com/questions/30451470/connection-to-db-dies-after-424-in-spring-boot-jpa-hibernate
https://stackoverflow.com/questions/25573034/spring-boot-how-do-i-set-jdbc-pool-properties-like-maximum-number-of-connection
https://zetawiki.com/wiki/
http://seongtak-yoon.tistory.com/31
'IT > 삽질로그' 카테고리의 다른 글
[삽질로그] db.collection is not a function (4) | 2018.01.23 |
---|---|
[삽질로그] 네이버 지도 API 활용하기 (Spring Boot RestTemplete 활용) (0) | 2017.08.10 |
[삽질로그] Spring boot에서 실행 가능한(Executable) JAR 만들기 (0) | 2017.07.16 |
[삽질로그] Spring boot에서 다중 파일업로드 처리하기 (0) | 2017.05.14 |
[삽질로그] SpringApplicationConfiguration 과 SpringBootTest의 사용 (0) | 2017.04.28 |