JDBC Socket Timeout

* WAS와 DBMS 통신시 타임아웃 계층 이해

JDBCinternal2

1. TransactionTimeout
  - 어플리케이션에서 트랜잭션으로 묶은 단위의 timeout
  - Spring에서 xml이나 @Transactional을 이용해서 설정 할 수 있다

2. StatementTimeout
  - query statement 하나당 timeout
  - 기본적으로는 JDBC의 java.sql.Statement.setQueryTimeout(int timeout) 메소드로 설정
  - ORM에 따른 설정 방법 제공

3. SocketTimeout
  - JDBC 드라이버와 DBMS 사이의 socket timeout
  - connectTimeout과 socketTimeout 두 가지가 있음
  - connectTimeout: socket 연결에 관한 timeout
  - socketTimeout: socket read/write 관한 timeout

비고) Transaction은 다수(n개)의 statement를 포함할 수 있기 때문에 n * StatementTimeout + 𝝰 이상으로 잡아줘야 하고, SocketTimeout은 하나의 statement가 끝날때 까지는 유지해 줘야 함으로 StatementTimeout 보다는 크게 잡아 줘야 한다.


위 내용은 출처에서 내가 필요한 내용 위주로 간추린 것인데, 주로 Oracle을 사용하다 보니 이에 대해 Socket Timeout 포커스를 맞춰 적어 보면,

MySQL을 사용할 때는 아래처럼 url query param으로 줬었는데

jdbc:mysql://xxx.xx.xxx.xxx:3306/database?connectTimeout=60000&socketTimeout=

Oracle의 경우는 oracle.jdbc.ReadTimeout=milliseconds로 설정이 가능한데,
DriverURL로 설정할 수 없고, OracleDatasource.setConnectionProperties() API를 통해 Properties 객체로 전달해야 한다. DBCP사용 시 다음 API를 사용한다.
BasicDatasource.setConnectionProperties()
BasicDatasource.addConnection
이렇게 해야 한다고 한다. Spring Boot를 사용하면 HikariDataSource 설정시 setDataSourceProperties() 를 통해서 설정해 줄 수 도 있을거 같다.(https://stackoverflow.com/a/59354218/1411827)


출처: https://d2.naver.com/helloworld/1321
참고: https://docs.oracle.com/cd/E57185_01/ESTUG/apbs02s23.html

댓글

이 블로그의 인기 게시물

[Protocol] WIEGAND 통신

Orange for Oracle에서 한글 깨짐 해결책

[UI] GNB·LNB·SNB·FNB 용어 설명