아래중에 내가 겪은 것은 첫번째 사항임
티베로를 사용할 예정인데 동일한 증상이면 대략 골치가 아픈데...
출처 : http://solidev.tistory.com/21
내가 가장 좋아하는 두개의 라이브러리가 조합시 아쉬운 버그가 있어서 이렇게 남기게 되었다.
이렇게 찾은 버그는 같은 버그로 고민하는 사람들에게 "아! 버그구나" 하고 위안을 삼을 수 있고
불철주야 노력하는 오픈 소스 개발자 분에게 도움이 되었으면 하는 바람이다.
1. 트랜젝션(Transaction) 모드의 경우 반복되는 쿼리 실행 불가 (오라클 oracle)
List list = sqlmap.queryForList(sqlQuery, parameter);
if(fsmb.getReturnFilter() != null){
for(int idx=0; idx < list.size(); idx++){
list.set(i, this.filtering((HashMap)list.get(idx), fsmb.getReturnFilter()));
}
}
형태로 반복하거나 테스트를 위해서 같은 조건으로 쿼리를 반복하는 경우 log4sql 을 사용하면
명령문 종료
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
at oracle.jdbc.driver.OracleStatement.ensureOpen(OracleStatement.java:3546)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3351)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3476)
at core.log.impl.PreparedStatementLoggable.execute(PreparedStatementLoggable.java:109)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at core.log.aop.handler.DaoInfo.doAround(DaoInfo.java:97)
at core.log.aop.reflection.profiler.AroundProfiler.invoke(AroundProfiler.java:19)
at $Proxy1.execute(Unknown Source)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeUpdate(SqlExecutor.java:80)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.sqlExecuteUpdate(MappedStatement.java:216)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeUpdate(MappedStatement.java:94)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.insert(SqlMapExecutorDelegate.java:393)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.insert(SqlMapSessionImpl.java:82)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.insert(SqlMapClientImpl.java:58)
at net.ion.flow.servlet.FlowActionServlet.service(FlowActionServlet.java:103)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:595)
형태의 에러가 발생한다.
log4sql을 안쓰거나 트랜젝션을 안쓰면 문제는 해결된다.
그러나 트랜젝션은 포기할 수 없으니 log4sql 를 빼야한다. (가슴이 아프다 ㅜㅜ)
2. 에러코드 반환값 불일치
SQL쿼리에서 익셉션이 발생하면 에러코드를 반환하는데 log4sql을 쓰면 0 이 반환 된다.
나의 경우에는 에러코드를 가지고 여러가지 처리를 하는데 log4sql을 쓰면서 포기했었다 ㅜㅜ
그만큼 강력하지만 1번문제로 인해서 ㅜㅜ 어쩔 수 없이 이제 log4sql을 사용할 수 없게 되었다.
버그가 어서 수정되는 마음으로 조심스레 개발자 분에게 트랙백 걸어본다.