태그 보관물: mybatis

mybatis의 SqlSession에서 commit();close(); vs close(); 어떤걸 해야 하나요?

코드를 보다보니, 아래와 같은 코드가 있어서 확인해 봤습니다.. ^^;;

try {

session = createSqlSession();
// db 처리.. .
} finally {
// db 세션 종료
if(session != null) {
session.commit();
session.close();
}

}

그래서, http://code.google.com/p/mybatis/source/browse/tags/mybatis-3.0.4/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java 의 session코드에서 commit메쏘드와 close메쏘드를 살펴 봤습니다..

* commit() : 오버로딩하는 두개의 메쏘드가 있네요.. ^^

  public void commit() {
    commit(false);
  }

  public void commit(boolean force) {
    try {
      executor.commit(isCommitOrRollbackRequired(force));
      dirty = false;
    } catch (Exception e) {
      throw ExceptionFactory.wrapException(“Error committing transaction.  Cause: ” + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

* close()

  public void close() {
    try {
      executor.close(isCommitOrRollbackRequired(false));
      dirty = false;
    } catch (Exception e) {
      throw ExceptionFactory.wrapException(“Error closing transaction.  Cause: ” + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

위 코드를 보시면, commit();close(); 코드와 close();가 있습니다..
코드를 따라가다 보면, 결국, http://code.google.com/p/mybatis/source/browse/tags/mybatis-3.0.4/src/main/java/org/apache/ibatis/transaction/jdbc/JdbcTransaction.java 에서, 아래와 같은 코드를 볼 수 있습니다.


  public void commit() throws SQLException {
    if (!connection.getAutoCommit()) {
      connection.commit();
    }
  }


  public void close() throws SQLException {
    resetAutoCommit();
    connection.close();
  }


  protected void resetAutoCommit() {
    try {
      if (!connection.getAutoCommit()) {
        // for compatibility we always use true, as some drivers don’t like being left in “false” mode.
        connection.setAutoCommit(true);
      }
    } catch (SQLException e) {
      // Only a very poorly implemented driver would fail here,
      // and there’s not much we can do about that.
      throw new TransactionException(“Error configuring AutoCommit.  ” +
          “Your driver may not support getAutoCommit() or setAutoCommit(). Cause: ” + e, e);
    }
  }

흠, 따라서 commit();close();와 close();가 동일할 거라는 심증만 가지게 되네요..^^;;
commit();close();해야 하나요?? close();만 하면 되까요?? ㅋㅋ

ibatis/mybatis에서 oracle connection detect 하기..

http://novathin.kr/님께서 알려준, 오라클 db conn detect할 수 있는 옵션입니다.
<dataSource type=”POOLED”> 안에 아래의 property를 넣어주면 됩니다..

<property name=”poolPingEnabled” value=”true”/>
<property name=”poolPingQuery” value=”select 1 from dual”/>

아, 좋네요.. ^^

Mapped Statements collection does not contain value xxx.xxx.xxx.xxx 에러

ibatis나 mybatis에서 XML을 사용해서 쿼리문을 작성해서 쿼리를 실행한 경우, 아래와 같은 에러를 볼 수 있다.

java.lang.IllegalArgumentException: Mapped Statements collection does not contain value xxx.xxx.xxx.xxx

이 에러가 나는 겨우, 알면 쉽지만 모르는 경우 찾는게 쉽지 않았다.
이 에러는 매퍼(Mapper)에 선언한 메서드 이름과 매퍼 파일(XML)에 기술한 쿼리문(Select, Insert 등)의 이름이 같지 않아서 발생하게 된다.

위 에러가 발생시키는 예는 다음과 같다.

ex) 인터페이스 이름

public String print(String x) throws Exception;

ex) mapper.xml


<select id="prints" statementType="CALLABLE" parameterType="String" resultType="String">
        .........................
</select>