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が実行されるとキャッシュはクリアされる。
  • このデフォルト動作は設定ファイルで上書きできる。
  • 設定の詳細はこちらを参照すること。