ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JDBC Timout 이해하기
    database 2021. 5. 31. 12:25

    Timeout 이해하기

    Timeout 계층 구조

    위 그림처럼 timeout은 계층적 구조를 갖고 있다. 상위timeout은 하위timeout에 의존적이다. 즉, 하위 timeout이 제대로 동작해야지 상위 timeout 또한 제대로 동작한다. 예를 들어 TransactionTimeout은 StatementTimeout이 제대로 처리되어야 본인의 처리를 할 수 있다. 좀더 곰곰이 생각해보면 상위 timeout을 하위 timeout보다 적은 시간으로 설정하는 건 무의미하다고 볼 수 있다.

     

    최 하위인 JDBC Driver SocketTimeout은 OS의 SocketTimeout에 의존적이다. 즉, java의 설정이 아닌 OS의 설정에서 소켓 timeout이 발생하면 JDBC Driver SocketTimeout은 따로 설정하지 않아도 timeout이 발생한다.

     

    Transaction Timeout

    애플리케이션의 한 트랙잭션에서 수행하는 모든 Statememt가 수행될 때 유효한 timeout이다. spring의 @Transactional(timeout = )으로 직접 설정이 가능하며 default로 시스템 timeout을 이용한다. Thread Local에Connection정보를 저장한 뒤 경과시간을 체크하여 예외를 발생시킨다. timeout이 2초인 트랜잭션에서 100번의 쿼리는 성공하는데 반해 1000번의 쿼리는 TransactionException이 발생하고 원인으로 timeout이 나오는 걸 확인할 수 있다.

     

    Statement Timeout

    하나의 쿼리가 수행될 때 유효한 timeout이다. 쿼리생성부터 요청까지의 시간이므로 네트워크 장애와는 무관하다.

     

    - Connection.createStatement()를 이용해 Statement생성

    - executeQuery() 호출

    - DBMS로 쿼리 전송

    - 새로운 timeout처리 스레드를 생성하고 등록, 동일한 커넥션 정보로 커넥션 획득

    - timeout이 발생하면 timeout처리 스레드가 DBMS로 직전 쿼리 취소 쿼리 호출

     

    JDBC Driver Socket Timeout

    JDBC Driver가 DBMS와 통신하는 타입은 4가지가 있다. 그 중 소켓을 이용한 타입이 있고 소켓은 네트워크 통신을 담당한다. TCP/IP 스택으로 네트워크 통신을 한다면 네트워크에 장애가 생긴 경우 소켓은 상황을 알 수 없다. 이때 따로 애플리케이션에서 socket timeout을 설정하지 않는다면 오지 않을 응답을 소켓은 영원히 기다릴 수도 있다.(dead connection)

    물론 JDBC는 OS Socket Timeout에 종속됐기 때문에 시간이 지나면 자원은 회수되지만 일반적으로 OS Socket Timeout는 긴 편이다. 절절히 socket timeout을 설정하여 네트워크 장애 또한 상대 서버 장애로 인한 무응답 상태에 대처할 수 있다. (timeout 계층도에서 언급했지만 최하단인 JDBC Driver Socket Timeout에서 무한 대기 상태에 빠지만 상위 timeout은 무의미한 값이 된다)

     

    OS Socket Timeout

    JDBC도 결국 OS의 소켓을 이용하기 때문에 OS소켓의 timeout을 설정하면 애플리케이션에도 영향을 끼친다. 위에서 언급한 timeout은 애플리케이션에서 설정한 논리적인 timeout이고 OS Socket Timeout은 시스템 전체에 미치는 timeout이다.

     

     

     

     

    참고

    https://d2.naver.com/helloworld/1321

    거의 내용을 복사하다시피 정리했다. 아직 운영환경의 경험이 없다보니 이론적으로밖에 접근할 수 없는 게 아쉽다 ㅠ

    'database' 카테고리의 다른 글

    데이터베이스 기초(쿼리 위주)  (0) 2021.03.16
    트랜잭션과 트랜잭션 격리수준  (0) 2021.02.23
    RDBMS 아키텍처(MySQL)  (0) 2021.02.19

    댓글

Designed by Tistory.