반응형

1. 개요

 어느 날, 갑자기 SQLTimeoutException 에러가 특정 요청에서 간헐적으로 발생했다. 정확히는 월의 첫날 0시 00분부터 발생했다.

 

2. 오류 내용

### The error occurred while setting parametersSQLTimeoutException: ORA-01013: 사용자가 현재 작업의 취소를 요청했습니다.

 

3. 분석

 SQLTimeoutException 에러는 말 그대로 SQL 쿼리를 실행하기 위해 DB로 요청 후 wait Time을 초과하여 발생한 에러이다. 오라클 서버가 비지한 상태(ex - 배치)에서 DB 처리 요청이 들어간 것이다.

 하지만 위 시스템 내에 DB 요청 후 기다리는 wait Time이 따로 설정되어 있지 않았고, 요청을 보냈을 당시 DB에서 처리가 되지 않아 sqlTimeoutException을 떨군 것이었다.

 

mybatis의 설정파일에 waitTime의 기능을 하는 defaultStatementTimeout 설정을 추가해주었으며 코드는 다음과 같다.

1
2
3
    <settings>
        <setting name="defaultStatementTimeout" value="30"/> 
    </settings>
cs

 

4. 특이사항

 개발 서버에 위 현상이 발생하였다. 특정 쿼리에서만 발생하는 것 같아 mybatis 설정파일에서 defaultStatementTimeout을 세팅하지 않고 매퍼 파일 안에 다음과 같이 넣어주었다. 이렇게 하면 해당 쿼리에 대해서만 timeout 값이 적용된다. 방법은 아래와 같다.

1
<select id="id" parameterType="java.util.HashMap" resultType="test.dto" timeout = "60">
cs

하지만 작업을 진행하다보니 동일 문제가 발생하는 쿼리가 더 확인됐고, mybatis 설정파일에 defaultStatementTimeout을 설정하였다. 하지만 계속 sqlTimeoutException이 발생하였다.

db 관련 설정을 모두 확인해도 이상한점은 없었다.

이전처럼 매퍼 파일 안에 timeout을 설정했다.

된다!

 

이에 대한 원인 파악을 위해 구글링을 해 보았으나 찾지못했다.

혹시나해서 매퍼에 입력한 timeout값을 모두 지워보았다.

된다!!

 

결론.

timeout 값을 매퍼 파일 안에 각각 입력해줄경우 defaultStatementTimeout 값이 먹히지 않는다.

만약 defaultStatementTimeout 이 일하지 않을 경우 매퍼에 설정한 timeout값을 모두 지우자.

 

찾아보니 timeout값은 덮어씌워진다고한다. 그리고 간헐적으로 timeout값이 적용되는 것 같다.. 정확한 원인을 다시 찾아보도록 하겠다.

 

 >> 일반적인 mybatis 구조에서는 defaultStatementTimeout 이 적용되나, 필자가 맡은 프로젝트는 사내 플랫폼 기반 안에 mybatis가 접목된 구조라 해당 설정이 적용이 되지 않는다고 한다. 아마 플랫폼 코어 내에 특정 부분에서 mybatis에 대한 설정을 덮어씌우는 구간이 있는 것으로 추정된다.

 

결론

 모두 다 적용시키려면 defaultStatementTimeout를, 특정 쿼리 ID에만 적용시키려면 timeout을!

반응형

+ Recent posts