MyBatis | 검색 결과를 임의의 Java 오브젝트에 매핑 | 캐시

소스 코드

Main.java

package sample.mybatis;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Main {

    public static void main(String[] args) throws Exception {
        try (InputStream in = Main.class.getResourceAsStream("/mybatis-config.xml")) {
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

            try (SqlSession session1 = factory.openSession();
                 SqlSession session2 = factory.openSession();) {

                TestTable testTable = selectAndPrintln("session1", session1);
                testTable.setValue("update");

                selectAndPrintln("session1", session1);

                selectAndPrintln("session2", session2);
            }
        }
    }

    private static TestTable selectAndPrintln(String tag, SqlSession session) {
        TestTable result = session.selectOne("sample.mybatis.selectTest");
        System.out.printf("<<%s>> %s%n", tag, result);
        return result;
    }
}

실행 결과

[DEBUG] s.m.selectTest  - ==>  Preparing: select * from test_table where id=1 
[DEBUG] s.m.selectTest  - ==> Parameters: 
[DEBUG] s.m.selectTest  - <==      Total: 1
<<session1>> TestTable [id=1, value=hoge]
<<session1>> TestTable [id=1, value=update]
[DEBUG] s.m.selectTest  - ==>  Preparing: select * from test_table where id=1 
[DEBUG] s.m.selectTest  - ==> Parameters: 
[DEBUG] s.m.selectTest  - <==      Total: 1
<<session2>> TestTable [id=1, value=hoge]

설명

  • 검색 결과는 캐시된다.
  • 동일한 검색을 다시 실행하면 캐시된 객체가 반환된다.
  • 캐시는 세션마다 저장되므로 다른 세션에서 변경의 영향을 받지 않는다.
  • 기본값은 다음과 같은 동작을 하는 것 같다.
    • 1024 개체를 캐시한다.
    • 가장 사용되지 않은 캐시에서 제거되어 간다.
    • 시간 경과에 제거되지 않는다.
    • insert, update 및 delete가 실행되면 캐시는 지워진다.
  • 이 기본 동작은 설정 파일에 덮어 쓸 수 있다.
  • 설정의 자세한 내용은 여기를 참조하길 바란다.