DB 커넥션 풀에 유효성 검사 추가 (validationQuery)
All checks were successful
deploy-wise / deploy (push) Successful in 1m6s

DBCP 는 validationQuery 가 없으면 testWhileIdle 을 켜도 아무 검사도 하지 않는다.
종전에는 validationQuery 가 주석 처리돼 있고 검사 주기가 10000000ms(약 2.8시간)
이라 사실상 무검사였다. MySQL·MariaDB 의 wait_timeout 은 기본 8시간이므로 야간처럼
오래 논 뒤 첫 요청이 서버가 이미 끊은 커넥션을 받아 실패한다.

실제 발생: 2026-08-26 AccessLogDownloadJobWorker
  unexpected end of stream, read 0 bytes (socket was closed by server)

- validationQuery = SELECT 1 (종전 주석의 'select 1 from dual' 은 Oracle 표기)
- validationQueryTimeout 3초, testOnBorrow 켬
- 유휴 검사 주기 2.8시간 → 5분, 유휴 정리 기준 30분

commons-dbcp 1.3 의 BasicDataSource 에 네 setter 가 모두 존재함을 jar 로 확인했다
(없는 프로퍼티를 넣으면 컴파일은 통과하고 WAS 기동 때만 터진다).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
infraurp 2026-08-26 15:29:53 +09:00
parent 7f3c86c588
commit db1999175a

View File

@ -19,9 +19,25 @@
<property name="url" value="${Globals.Url}" /> <property name="url" value="${Globals.Url}" />
<property name="username" value="${Globals.UserName}"/> <property name="username" value="${Globals.UserName}"/>
<property name="password" value="${Globals.Password}"/> <property name="password" value="${Globals.Password}"/>
<!-- <property name="validationQuery" value="select 1 from dual" />--> <!-- 커넥션 유효성 검사 (2026-08-26 추가)
DBCP 는 validationQuery 가 없으면 testWhileIdle/testOnBorrow 를 켜도 아무 검사도
하지 않는다. 종전에는 이 줄이 주석 처리돼 있고 검사 주기가 10000000ms(약 2.8시간)
이라 사실상 무검사였다. MySQL·MariaDB 의 wait_timeout 은 기본 28800초(8시간)이므로
야간처럼 오래 논 뒤 첫 요청이 들어오면 서버가 이미 끊은 커넥션을 그대로 받아
"unexpected end of stream ... (socket was closed by server)" 로 실패한다
(2026-08-26 AccessLogDownloadJobWorker 에서 실제 발생).
종전 주석의 'select 1 from dual' 은 Oracle 표기다. 'SELECT 1' 은 MySQL·MariaDB
양쪽에서 동작한다. commons-dbcp 1.3 에 아래 네 setter 가 모두 존재함을 확인했다. -->
<property name="validationQuery" value="SELECT 1" />
<!-- 검사 자체가 매달리는 것을 막는다 -->
<property name="validationQueryTimeout" value="3" />
<!-- 빌려줄 때 검사한다. 같은 호스트/도커 네트워크의 SELECT 1 은 1ms 미만이라
죽은 커넥션을 그대로 넘기는 위험에 비해 대가가 싸다. -->
<property name="testOnBorrow" value="true" />
<property name="testWhileIdle" value="true" /> <property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="10000000" /> <!-- 5분마다 유휴 커넥션을 돌며 30분 넘게 논 것을 정리한다(종전 2.8시간은 너무 성겼다) -->
<property name="timeBetweenEvictionRunsMillis" value="300000" />
<property name="minEvictableIdleTimeMillis" value="1800000" />
</bean> </bean>
<!-- Oracle --> <!-- Oracle -->