환경 정보
- Java 버전 : 8
- HikariCP 버전: 4.0.3
- Oracle JDBC 드라이버 버전: 11.1.0.7.0 (ojdbc6.jar)
- Oracle DB 버전: 11.2.0.1.0
오류 내용
HikariCP를 사용하여 Oracle DB에 연결할 때, 다음과 같은 로그가 출력되며 경고가 발생한다.
[main] INFO com.zaxxer.hikari.HikariDataSource - [My Hikari Pool] - Starting...
[main] INFO com.zaxxer.hikari.pool.PoolBase - [My Hikari Pool] - Driver does not support get/set network timeout for connections. (oracle.jdbc.driver.T4CConnection.getNetworkTimeout()I)
[main] INFO com.zaxxer.hikari.HikariDataSource - [My Hikari Pool] - Start completed.
이 오류는 JDBC Driver에서 getNetworkTimeout() 및 setNetworkTimeout()을 지원하지 않기 때문에 발생한다.
해결 방법
JDBC Driver 버전 업데이트
Oracle JDBC Driver 12.1.0.2 이상에서는 해당 오류가 발생하지 않는다.
Oracle JDBC Driver Version | JAR 파일명 | 결과 |
12.2.0.1 이상 | ojdbc8.jar | 정상 작동 |
11.2.0.4 이하 | ojdbc6.jar | 오류 발생 |
따라서, 최신 JDBC 드라이버(ojdbc8)로 업그레이드하면 문제를 해결할 수 있다.
오류 원인 분석
HikariCP에서 커넥션을 설정할 때, 내부적으로 네트워크 타임아웃(networkTimeout) 값을 설정하려고 한다.
이 과정에서 현재 사용 중인 JDBC 드라이버가 해당 기능을 지원하는지 확인하는데,
만약 getNetworkTimeout() 및 setNetworkTimeout() 메서드가 없으면 오류가 발생한다.
즉, HikariCP가 네트워크 타임아웃을 설정하려 하지만, JDBC 드라이버에서 지원하지 않으면 예외가 발생하는 것!
JDBC 드라이버 차이점
오류 메시지를 따라가 보면,
HikariCP는 com.zaxxer.hikari.pool.PoolBase 클래스에서 새로운 Connection을 생성할 때 networkTimeout 값을 설정한다.
이때, Oracle JDBC 드라이버에서 해당 기능을 지원하는지 확인하기 위해 다음 메서드를 호출한다.
oracle.jdbc.driver.T4CConnection.getNetworkTimeout()
그러나, 사용 중인 JDBC 드라이버 버전에 따라 해당 메서드의 존재 여부가 다르다.
JDBC 드라이버 | oracle.jdbc.driver.T4CConnection.getNetworkTimeout() |
ojdbc6.jar (구버전) | 없음 (미구현) → 오류 발생 |
ojdbc8.jar (신버전) | 있음 → 정상 작동 |
즉, ojdbc6.jar에는 getNetworkTimeout() 메서드가 존재하지 않기 때문에 HikariCP에서 오류가 발생한다.
반면, ojdbc8.jar에서는 해당 메서드가 구현되어 있어 오류 없이 동작한다.
결론
- HikariCP 사용 시 ojdbc6.jar를 사용하면 getNetworkTimeout() 관련 오류가 발생할 수 있다.
- 해결하려면 JDBC 드라이버를 ojdbc8.jar로 업그레이드해야 한다.
참고
- GitHub Issue: Hikari for Oracle warning #743