'Oracle JDBC의 CachedRowSet Implement Bug'에 해당되는 글 1건

  1. 2014.07.29 [펌] Oracle JDBC의 CachedRowSet Implement Bug
02.Oracle2014. 7. 29. 17:57
반응형

Oracle JDBC의 CachedRowSet Implement Bug

CachedRowSet을 사용하는 경우 Oracle JDBC의 CachedRowSet Implementation Bug 때문에 더 이상 고생하는 개발자가 없기를 바라며 이 글을 작성한다.

결론부터 말하자면 Oracle의 JDBC Driver가 CachedRowSet을 Implement한 Class의 Method 중 Date Type에 대한 Bug로 인해 CachedRowSet을 이용한 Code에서 오류가 발생될 수 있다는 것이다. 그리고 이는 Patch된 최신 Version인(현재 시점) 'ojdbc5.jar' 이상을 사용해야 해결될 수 있는 문제라는 것이다.

아래의 몇 몇 오류들은 Bug가 있는 - 오류가 Patch되지 않은 - Oracle JDBC를 이용해 CachedRowSet을 사용할 경우 발생될 수 있는 Error Message들의 예로, 궁극적인 문제의 원인은 Date Type의 DB Field를 CachedRowSet의 'getDate()' Method로 참조할 때 발생하는 'java.lang.ClassCastException'이 바로 그 것이다.
 
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.TransactionSystemException: Could not roll back JDBC transaction; nested exception is java.sql.SQLException: Connection is closed.
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:583)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

[ErrorMessage-1]
  • ErrorMessage-1
       Spring Framework를 연동했을 때 발생될 수 있는 예로 'ClassCastException' 발생으로 인해 해당 Transaction에 대한 Roll back을 Spring Framework이 AOP를 통해 수행하려는 상황에서 발생된 오류인데, 이 오류는 엄밀히 말하면 일반적인 상황에서는 발생하지 않을 수도 있다. 왜냐하면 이 상황은 필자의 경우로 'Javassist'를 이용해 Connection Object를 Intercept한 경우이기 때문이다.

org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0];
--- The error occurred in sqlMap.xml.
--- The error occurred while applying a result map.
--- Check the scope.select.
--- Check the result mapping for the 'createDate' property.
--- Cause: java.lang.ClassCastException: java.sql.Timestamp; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in sqlMap.xml.
--- The error occurred while applying a result map.
--- Check the scope.select.
--- Check the result mapping for the 'createDate' property.  
--- Cause: java.lang.ClassCastException: java.sql.Timestamp
[ErrorMessage-2]

  • ErrorMessage-2
       Spring Framework와(과) iBATIS를 연동했을 경우 debugging 과정에서 추출한 Error Message로 오류의 원인을 정확히 짚어내고 있다. 하지만 오류내용을 보면 마치 'java.sql.Timestamp' Type을 다른 Type으로 잘 못 Casting해 발생한 오류인 것 처럼 보인다.
사실과 다르게 말이다. Error Message에 보이는 'createDate'라는 Field는 분명 'Date' Type인 것이다. 또한 CachedRowSet이 아닌 ResultSet으로는 전혀 문제가 발생하지 않은 Code이다.

이 문제의 원인을 찾는데 상당히 많은 시간을 소요했으며 정신적 스트레스 또한 말 할 수 없이 많았다. 지금까지의 Posting 글이 그러했듯 같은 오류에 대해 적어도 필자 보다는 적은 시간과 노력으로 좋을 결과를 얻기를 바라는 마음이다.
국내 검색 Site에서는 관련 오류 내용을 검색조차 할 수 없었으나 역시 Googling을 통해 알게된 외국의 한 Community Site에 올린 누군가의 글로 해결의 실마리를 찾게 되었다. 물론 이 도 쉽지많은 않앗지만 말이다. 아무튼 도움이 되길 바라며 Posting한다.


출처 : http://mobicator.blogspot.kr/2010/04/oracle-jdbc-cachedrowset-implement-bug.html

Posted by 1010