리눅스 서버에 사용할 배치 프로그램을 하나 작성하다가 궁금증이 생겨 이것저것 찾아보다 발견한 글이다.
요점은 ibatis에서 java connection 후 insert or update를 하는 도중 서버 통신이 끊겼을 경우 rollback을
막기위한 autocommit 설정이다.
배치돌리는데 최소 5000에서 1만건정도의 데이터를 인서트하게되기때문에 중간에 끊기면 쉽지않을거 같아서 그냥 중간에 autocommit 설정을 true로 설정했다.
기본은 false라서 .. con.autocommit 설정을 true로 해줘야한다.
그런데 밑에 글을 보면 dhcp 때문에 .. 문제되는경우는 무조건 롤백이 된다는 내용이 있는듯한데.. 테스트를 함 해봐야할듯하다..
아래는 퍼온 글의 전문이다.
================================================================================
http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=40288
처음에는 어느 블로그에서 글을 보고
그걸 바탕으로 조사를 했었는데, 위 기고문의 내용을 보니...
처음 참고하였던 그 블로그와는 내용이 조금 다른(?.. 결과적으로는 같지만.. 과정 설명이 좀 다른.. )..
좀 미묘하게 차이가 나는 부분이 있어서 위 글을 보고 소스를 열어서 참고해보았다.
일단.... ibatis의 아래 설정에 의해서..
<transactionManager type=”JDBC”>
....
</transactionManager>
ibatis에서 JDBCTransaction이 사용되고.. 거기서 아래와 같이 connection.setAutoCommit(false)가 실행됨..
if(conn.getAutoCommit()) {
conn.setAutoCommit(false);
}
ibatis에서 commit을 실행하는 조건은
if (session.isCommitRequired() || forceCommit) {
trans.commit();
session.setCommitRequired(false);
}
session.isCommitRequired는 sqlMapClient에서 excuteUpdate등을 실행 할 때 true로 셋팅되며
forceCommit은 ibatis설정에서 commitRequired=true를 설정하면 true가 된다.
디폴트 설정에서는 forceCommit은 항상 false이기 때문에, JDBC Connection의 autoCommit이 항상 true라고 하더라도..
맨 위에서 false가 되어버리지만.. update, delete에서는 commitRequired에 의해서 commit이 이루어진다.
반대로 ibatis의 transaction설정에서 commitRequired=true라면..select문에 대해서도 무조건 commit이 실행됨.
그러면...디폴트 설정에서 select 실행시에는 autocommit=false인 상태로 connection이 반환되는건가?
아래의 DBCP의 PoolabledConnectionFactory를 보면 connection을 반환할때 아래의 문장이 실행되는데
if(!conn.getAutoCommit() && !conn.isReadOnly()) {
conn.rollback();
}
conn.clearWarnings();
if(!conn.getAutoCommit()) {
conn.setAutoCommit(true);
}
autoCommit은 false인 상태이므로...