Caused by: java.sql.SQLException: Connection org.mariadb.jdbc.MariaDbConnection@ is closed.
at org.apache.commons.dbcp2.DelegatingConnection.checkOpen(DelegatingConnection.java:607)
작업시간이 꽤 소요되는 연동 스케줄러를 하나 돌렸는데, 위와 같이 DbConnection이 닫혔다.
호출은 A 서버에서 -> B 서버로 요청을 하였고 B 서버에서 무거운 로직이 수행되었다.
A 서버에서 B 서버의 로직 호출 후, 응답을 받지 못하고 붕뜨는 상태가 되어 유후 세션으로 판단되었으므로
A서버에서 위의 Error 로그가 남았고, A서버의 dataSource 설정을 변경하여 해결되었다.
필자는
"timeBetweenEvictionRunsMillis" - Evictor라는 유효하지 않은 커넥션을 제거하는 스레드의 수행주기
"minEvictableIdleTimeMillis" - Evictor 스레드 수행시 커넥션 만료 여부를 체크하는 수행 주기
두개의 속성값을 각
120000(120초) -> 310000(310초) / 110000(110초) -> 300000(300초) 로 테스트 후 변경하였다.
* Evictor 쓰레드는 아래의 "validationQuery" 를 통해 해당 커넥션이 유효한지 체크를 한다.
개념정리
dbcp?
DataBase Connection Pool
- 많은 어플리케이션이 DB와 상호작용을 하여 데이터를 주고 받는다. 이때, 연결하는 라이브러리 중 하나이며,
Spring 환경에서라면 dataSource.xml 에 아래와 같이 설정하여 dbcp 라이브러리를 통해 데이터베이스에
접근이 가능하다. 아래의 속성값을 조절하여 Connection Pool을 설정해 줌으로써, 원하는 연결상태를
만들 수 있다.
주요 속성 값
maxActive
동시에 사용가능한 최대 커넥션 수 (기본 8)
maxIdle
커넥션 풀에서 유지될수 있는 idle 상태 커넥션의 최대 개수. (기본값 : 8)
maxWait
커넥션 사용이 많아져서 커넥션 풀이 비었을때, 사용할수 있는 커넥션을 반환받기까지 기다릴수 있는 최대시간 (ms) (기본값: -1, 무한대기)
validationQuery
커넥션 풀에서 커넥션을 가져올때 해당 커넥션의 유효성 검증에 사용할 SQL Query (반드시 하나 이상의 row 가 반환될 SELECT 구분이어야 함.)
testOnBorrow
커넥션 풀에서 커넥션을 가져올때 해당 커넥션의 유효성 검사를 할것인지 여부. (기본값 : true, 반드시 validationQuery 가 설정되어 있어야 함.)
testOnReturn
testOnBorrow 와 비슷함. 다만 유효성 검사 시점이 커넥션을 풀에 반환할때 이다.
testWhileIdle
커넥션 유효성 검사를 풀에 idle 상태에 존재할때 실시할것인지 여부 (기본값 : false, 반드시 validationQuery 가 설정되어 있어야 함.)
timeBetweenEvictionRunsMillis
설정된 시간 간격마다 놀고 있는 커넥션을 풀에서 제거하는 evictor thread 가 실행된다. minIdle 로 커넥션을 유지한다.
minEvictableIdleTimeMillis
evictor thread 작업시 설정된 시간만큼 사용되지 않은 커넥션을 제거한다. 그리고, thestWhileIdle 옵션이 true일 경우 설정된 시간을 초과하지 않은 커넥션에 대해서 validationQuery를 수행해서 유효하지 않은 커넥션을 제거한다.
numTestsPerEvictionRun
evictor thread 가 한번실행시 검사할 대상 커넥션 개수.
* 참고
https://commons.apache.org/proper/commons-dbcp/
- apache 공식 사이트
https://d2.naver.com/helloworld/5102792
- naver 기술 블로그
- 커넥션 DBCP 설정 참고
본문 내용이 도움이 되셨다면, 아래의 공감버튼을 눌러주세요.
정보 공유를 위한 포스팅에 큰 힘이 됩니다.
만약 틀린 정보가 있으면 댓글 달아주세요. 수정하도록 하겠습니다.
읽어주셔서 감사합니다. 오늘도 좋은 하루 보내세요.