TIL icon indicating copy to clipboard operation
TIL copied to clipboard

ojdbc(oracle) 사용시 DB 타입 Date 값이 ZonedDateTime 변환되는 과정 분석

Open wicksome opened this issue 6 years ago • 0 comments

커스텀 핸들러 없는 경우

DB내에 필드타입은 DATE인 경우이다.

  • com.oracle.ojdbc:ojdbc8:19.3.0.0
  • org.mybatis:mybatis:3.5.3
  1. mybatis에서 제공하는 ZonedDateTimeHandler.getNullableResult(ResultSet, String) (org.apache.ibatis.type)
  2. OracleResultSet.getObject(String, Class) (oracle.jdbc.driver)
  3. InsensitiveScrollableResultSet.getObject(int, Class) (oracle.jdbc.driver)
  4. OracleStatement.getObject(long, int, Class) (oracle.jdbc.driver)
  5. Accessor.getObject(int, Class) (oracle.jdbc.driver)
  6. Representation.getObject(Accessor, int, Class)(oracle.jdbc.driver)
  7. Representation.getRedirector(Class) (oracle.jdbc.drive)
  8. Redirector.CLASS_TO_REDIRECTOR 안의 익명클래스의 redirect(Accessor, int) (oracle.jdbc.driver)
  9. DateTimeCommonAccessor.getZonedDateTime(int) (oracle.jdbc.driver) 9.1. this.tmpBytes가 초기화된 이후에 var1값과 함께 this.getBytesInternal(int, byte[]) 메서도 동작시 this.tmpBytes에 값이 설정된다. 9.2. this.tmpBytes를 통해 LocalDateTime.of(int, int, int, int, int, int, int)(2020, 2, 3, 0, 0, 0, 0)으로 전달된다. 9.3. ZoneOffset.UTC가 default 값으로 먼저 설정된다. 9.4. this.tmpBytes[11]Zone 이 저장되는 것 같은데, 값이 없을 경우에 9.3에서 설정한 offset이 var4에 저장된다. 9.5. returen var3.atZoneSameInstant(ZoneId)와 같은 코드로 반환되는데, Zone이 같으므로 ZoneOffset.UTC로 설정된다.

image

wicksome avatar Feb 07 '20 02:02 wicksome