일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- jdk
- javascript
- 보안취약점
- reactjs
- table
- 스프링
- springboot
- DATABASE
- Spring
- GIT
- Intellij
- restapi
- 스프링부트
- JS
- component
- 자바스크립트
- 쿼리
- java
- sql
- React
- crud
- 개발
- 개발공부
- 데이터베이스
- 리액트
- Vue
- 자바
- EXTJS
- 컴포넌트
- mssql
- Today
- Total
준준의 기록일지
[MsSql] DBCP validationQuery 설정 본문
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
상기 에러가 발생했을때 sql 연결을 재설정 하도록 수정해야했다.
DB에 접속중인 세션을 오랫동안 사용하지 않거나, 네트워크에 문제가 발생하는 경우 DB 세션이 끊어질 수 있다고 한다.
DB 세션이 끊어지는 경우 App 입장에서는 재접속 처리를 해주어야 다시 정상적인 서비스가 가능해진다.
팀에서 요청한 에러 발생 시 sql 연결 재설정의 경우 아래 방법을 따르면 될 것으로 보인다.
JDBC, autoReconnect = true 옵션을 준다.
해당 옵션은 쿼리를 수행한 다음 DB 세션에 문제가 있으면 단순히 SQLException을 리턴한 후 재접속 처리를 한다.
문제는 트랜잭션 구동 환경에서 수행중이던 트랙잭션은 롤백되어야 하고, 남은 트랜잭션은 수행이 되지 않아야 하는데, autoReconnect 옵션은 이런 처리를 해주지 않기 때문이다.
위와 같은 문제를 막기 위해서는 autoReconnect=true인 환경에서 SQLException이 발생하는 경우, 해당 트랜잭션이 더 이상 진행되지 않도록 App 단에서 직접 예외 처리를 해줘야 하고, 해당 autoReconnect 옵션 사용은 권장되지 않는다.
트랜잭션을 사용하는 환경이라면 DB 세션의 재접속 처리는 JDBC의 AutoReconnect 설정이 아닌 DBCP의 validationQuery 기능을 사용하는 것이 적합하다.
sql 기본 타임아웃 설정에 의해 커넥션이 연결된 이후 해당 커넥션의 close 없이 8시간이 지나면 해당 커넥션을 종료시키게 된다.
문제는 이렇게 종료된 커넥션을 dbcp의 connection pool에선 여전히 가지고 있는 상태!
이런 상황에서 DB관련 프로그램이 호출되면 커넥션 관련 에러가 발생한다.
- * 우리 솔루션은 already close라는 sql 커넥션 종료 에러가 짧은 주기로 발생하는데, 이 부분 디폴트가 몇인지 확인이 필요할 듯 하다.
해결 방법은 java 에서 DB를 사용하기 전에 해당 connection이 정상적인지 검사하는 것!
<property name="validationQuery" value="select 1"/>
<property name="testWhileIdle" value="true"/>
<property name="timeBetweenEvictionRunsMillis" value="7200000"/>
<!-- 특정 시간마다 validationQuery를 실행 셋팅 끝 -->
출처 : https://m.blog.naver.com/tyboss/70176230775
'Database' 카테고리의 다른 글
[데이터베이스] 뷰테이블 생성 및 특정 사용자 권한 부여 (0) | 2022.01.28 |
---|---|
[Hibernate] Criteria (0) | 2021.02.15 |
[sql] 복합키 (0) | 2021.01.25 |
[sql] 복합키 (0) | 2021.01.18 |
[sql] sql 쿼리를 활용한 ip주소 찾기. (0) | 2021.01.06 |