기본적으로 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
'프로그래밍 > J2EE' 카테고리의 다른 글
[정보] Java EE vs J2EE vs Jakarta EE (0) | 2023.08.30 |
---|---|
[요약] Java URLConnection과 HttpURLConnection 사용 방법 (0) | 2021.09.04 |
[정보] HttpServletResponse 객체 (0) | 2021.02.08 |
[정보] HttpServletRequest 객체 (0) | 2021.02.08 |
[정보] SSO 구현 방식 (0) | 2019.01.28 |