프로그래밍/J2EE

[Tips] JDBC 쿼리(Query) 타임아웃 설정

투칼론 2021. 9. 3. 22:41
반응형

기본적으로 JDBC 쿼리(Query)에는 제한 시간이 없으므로 JDBC 쿼리가 스레드를 무제한 시간 동안 블록(BLOCK)할 수 있다. 물론 DB 로드와 쿼리 비용에 따라 다르다. 특정 시간보다 오래 걸릴 수 있는 경우 이러한 쿼리를 타임아웃을 설정하는 것이 좋다.

1. Query 별 타임아웃

JDBC 문은 타임아웃(단위 : 초)을 설정 가능하다. 타임아웃이 설정되면 드라이버는 쿼리가 실행될 때 지정된 시간(초) 동안 대기하고(예: executeQuery 및 executeUpdate) 해당 시간 내에 응답하지 않으면 SQLTimeoutException 예외가 발생한다.


아래는 몇 가지 예제이다.

1
2
3
4
5
Statement stmt = connection.prepareStatement("SELECT * FROM BOOKS");
stmt.setQueryTimeout(10);  //Timeout of 10 seconds

// 10초가 초과되면, SQLTimeoutException 예외가 발생
ResultSet result = stmt.executeQuery();

 

1
2

4
5
6
7
PreparedStatement stmt = connection.prepareStatement("UPDATE BOOKS SET RETURNED = ? WHERE BID = ?");
stmt.setBoolean(1, true);
stmt.setString(2, "B1234");
stmt.setQueryTimeout(5);  //Timeout of 5 seconds
   
// 5초가 초과되면, SQLTimeoutException 예외가 발생
stmt.executeUpdate();

 

2. 글로벌 타임아웃 (JDBC 드라이버 수준)

모든 쿼리 실행에 대해 동일한 타임아웃을 설정해야 하는 경우 드라이버 레벨에서 직접 설정할 수 있다. 이 옵션은 드라이버마다 지원 여부 및 설정 방법이 다르다.

다음은 Oracle Thin Driver에 설정된 타임아웃의 예시이다.

1
2
3
4
5
6
Properties properties = new Properties();
properties.setProperty("user", "scott");
properties.setProperty("password", "tiger");
// 타임아웃은 밀리초(1/1000초)이고, 드라이버마다 다름
properties.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_READ_TIMEOUT, "2000");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:1521:SID", properties);

참고로, WebLogic(WAS)에서 이 값은 관리콘솔에서 "Statement Timeout"을 설정하면된다. 아래 링크글 참조.

[JDBC Statement 타임아웃 설정] https://blueyikim.tistory.com/1500

 

3. 스프링 JDBC 타임아웃

JDBC 문을 직접 제어할 수 없는 Spring JDBC를 사용하는 경우, JDBCTemplate은 setQueryTimeOut에 대한 옵션을 제공한다. -1로 설정하면, 위에서 설명한 JDBC 드라이버의 기본 설정 타임아웃값을 사용한다.

1
2
getJdbcTemplate().setQueryTimeout(5);
getJdbcTemplate().update("UPDATE BOOKS ...", sqlParamSource);

 

[글원본] https://www.codelooru.com/2017/02/how-to-timeout-jdbc-queries.html