장애 상황에서 우리는 주로 WAS, DBMS 를 살펴보게 되는데, 그 중 이를 이어주는 DBCP와 JDBC에 대해서 학습합니다.
JDBC는 Java Database Connectivity의 약자로 Java Application이 DBMS에 접근할 수 있도록 해주는 표준 API 스펙이다. 아래 작성된 총 4가지 Driver Type을 지원하고 있으며 본문에서는 4번 Pure Java로 작성되었으며 소켓을 통해 통신하는 Type 4 드라이버에 대해서 설명한다.
- *JDBC-ODBC bridge
소켓을 통해 바이트 스트림을 처리하기에 SocketTimeout 값이 적절하게 설정되지 않아 장애(hang)이 발생할 수도 있다. 장애를 방지하기 위해 이를 어떻게 설정해야 하는지를 알아본다.

getConnection() 을 통해 Connection을 획득할 때까지의 타임아웃은 지정할 수 있지만 이는 JDBC ConnectionTimeout과는 연관이 없다.이 때 하위 레벨의 타임아웃이 정상적으로 동작하지 않으면, 이 영향이 상위로 전파되어 상위 레벨의 타임아웃도 정상적으로 동작하지 않는다.
StatementTimeout은 네트워크 연결 장애에 대한 타임아웃을 담당하는 것이 아니다. StatementTimeout은 Statement 한 개의 수행 시간을 제한하는 기능만 담당한다. 네트워크 장애에 대비하는 타임아웃은 JDBC Driver SocketTimeout이 처리해야 한다.
StatementTimout * 수행되는 Statement의 개수 + GC 소요 시간 + 기타@Transactional 등의 어노테이션을 사용해 설정이 가능하며, 간단하게 시작 시간, 경과 시간을 기록해 설정한 Timeout이 넘으면 예외를 던지는 방식으로 동작한다.java.sql.Statement.setQueryTimeout(int timeout) 메서드로 설정이 가능할 수 있지만, 개발자가 이를 직접 핸들링하는 경우는 드물며 프레임워크를 통해 설정할 수 있다.