관리 메뉴

초보 프로그래머의 하루

ojdbc를 통해 SESSIONTIMEZONE 사용할 때 문제( feat. timezone 에러 ) 본문

Java

ojdbc를 통해 SESSIONTIMEZONE 사용할 때 문제( feat. timezone 에러 )

nabina 2015.05.11 10:31

거지같은 에러가 발생했다. Local 환경에서 ojdbc를 사용하여 SESSIONTIMEZONE을 가져오면 Timezone값을 정상적으로 가져오는데 반해, Server 환경에서 SESSIONTIMEZONE을 가져오면 +9가 아닌 0값을 가져오는 문제가 발생했다. 결론부터 얘기하자면, 사용하는 ojdbc14.jar 파일의 버전이 달랐던 것. 서버 환경에서는 9.0.2.0.0 버전의 ojdbc14.jar 파일이 설치되어 사용되었고 로컬 환경에서는 10.2.0.5.0 버전을 사용 중에 있었다. SESSIONTIMEZONE 함수를 사용하려면 9.x 버전 말고 10.x대 이상의 버전을 사용해야 할 것이다.

어떤 식으로 문제가 발생하냐면.. 다음과 같은 코드를 9.x대의 ojdbc를 사용할 때, 10.x대의 ojdbc를 사용할 때로 나누어서 테스트 할 것이다.


import java.util.Calendar; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestCalendar { public static void main( String[] args ) { try { Class.forName( "oracle.jdbc.driver.OracleDriver" ); } catch ( ClassNotFoundException e ) { System.out.println( "Error" ); e.printStackTrace(); } try { Connection con = DriverManager.getConnection( "jdbc:oracle:thin:@10.0.0.86:1521:ora10", "zenius", "zenius123" ); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT SESSIONTIMEZONE FROM DUAL" ); while ( rs.next() ) { System.out.println( "ORACLE Session Timezone : " + rs.getString( 1 ) ); } } catch ( Exception e ) { e.printStackTrace(); } //1000ms = 1s, 3600s = 1h System.out.println( "Local Timezone() : " + ( Calendar.getInstance().getTimeZone().getRawOffset() / 1000 / 3600 ) ); } }

이 코드를 10.x대 버전의 ojdbc를 이용해 실행하면 다음과 같이 콘솔에 값이 나온다.


ORACLE Session Timezone : +09:00
Local Timezone() : 9


그리고 9.x대의 버전의 ojdbc를 이용해 실행하면 다음과 같이 나온다.


ORACLE Session Timezone : +00:00
Local Timezone() : 9

버전 9.x대의 ojdbc의 소스를 까보진 않아서 정확히 어떤 문제인지 모르겠지만 여튼 이런 문제가 발생하니 최소한 버전 10.x대 이상의 ojdbc를 사용해야 할 것이다.


ps. 아 참고로 9.x대의 ojdbc는 Tomcat 5.5에 포함되어 있었다.( 원래 있던 건지 누가 넣은 건지는 모르겠지만... )

0 Comments
댓글쓰기 폼