JavaでMybatisの2次キャッシュを使用する方法

PHPz
リリース: 2023-05-24 18:16:06
転載
1847 人が閲覧しました

    キャッシュの概要と分類

    概要

    キャッシュは、一時データを保存するメモリ空間の一部です

    キャッシュを使用する理由

    データ ソース (データベースまたはファイル) からデータを読み取り、キャッシュに保存します。取得する場合は、キャッシュから直接取得するため、データベースとのやり取りの数を減らすことができます。パフォーマンス!

    キャッシュの適用性

    キャッシュに適しています: 頻繁にクエリされるが頻繁に変更されない (例: 都道府県、都市、カテゴリ データ)、データは最終結果に影響を与えません。 Big

    キャッシュには適していません: 頻繁に変更されるデータ、機密データ (例: 株式市場価格、銀行為替レート、銀行カード内のお金) など。

    MyBatis キャッシュ カテゴリ

    レベル 1 キャッシュ: sqlSession オブジェクトのキャッシュです。これは付属しており (構成は必要ありません)、アンインストールすることはできません (使用したくない場合)。 1 次キャッシュのライフサイクルは sqlSession と一致します。

    2次キャッシュ: SqlSessionFactoryのキャッシュです。同じ SqlSessionFactory で作成された SqlSession が 2 次キャッシュの内容を共有していれば、2 次キャッシュを操作できます。 2 次キャッシュを使用したい場合は、自分で手動で有効にする必要があります (構成が必要です)。

    2 次キャッシュの使用

    1. mybatis

        <!--**因为 cacheEnabled 的取值默认就为 true**,所以这一步可以省略不配置。为 true 代表开启二级缓存;为 false 代表不开启二级缓存。  -->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    ログイン後にコピー

    のコア構成ファイルで 2 次キャッシュを有効にします2. 2 次キャッシュの使用を構成します。 Dao マッピング ファイル内のキャッシュ

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.itheima.dao.UserDao">
        <!--配置二级缓存-->
        <cache/>
       
        <select id="findAll" resultType="user">
            select * from t_user
        </select>
     
        <delete id="deleteById" parameterType="int">
            delete from t_user where uid=#{id}
        </delete>
    </mapper>
    ログイン後にコピー

    3. 第 2 レベル キャッシュの Pojo クラスは、シリアル化可能なインターフェイス

    public class User implements Serializable {
        private int uid;
        private String username;
        private String sex;
        private Date birthday;
        private String address;
        // 省略setter,getter,构造...等方法
    }
    ログイン後にコピー

    4. 第 2 レベル キャッシュの使用をテストします

    テスト コード

    @Test
          public void testFindAll() throws Exception{
              // 1.加载mybatis核心配置文件
              InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
     
              // 2.创建SqlSessionFactoryBuilder对象
              SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
     
              // 3.构建SqlSessionFactory对象
              SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
     
              // 4.获取SqlSession对象
              SqlSession sqlSession = sqlSessionFactory.openSession();
     
              // 5.获得dao接口的代理对象
              UserDao userDao = sqlSession.getMapper(UserDao.class);
     
              // 6.执行sql语句,得到结果
              List<User> list = userDao.findAll();
              for (User user : list) {
                  System.out.println("user = " + user);
              }
              sqlSession.close();//清除一级缓存
     
              System.out.println("分割线----------------------------------");
     
              SqlSession sqlSession2 = sqlSessionFactory.openSession();
              UserDao userDao2 = sqlSession2.getMapper(UserDao.class);
              List<User> userList2 = userDao2.findAll();
              for (User user : userList2) {
                  System.out.println(user);
              }
              // 7.释放资源
              sqlSession2.close();
          }
    ログイン後にコピー

    - テスト結果:

    JavaでMybatisの2次キャッシュを使用する方法

    #- 上記のテストの後、2 つのクエリが実行されたことがわかり、最初のクエリの実行後に、1次キャッシュをオフにしてから、2番目のクエリを実行するときに、データベースにSQLステートメントが発行されていないことがわかりました。そのため、この時点のデータは、いわゆる2次キャッシュからのみ取得できます。

    5. 2次キャッシュをオフにするテスト

    -テストコード

       @Test
          public void testFindAll() throws Exception{
              // 1.加载mybatis核心配置文件
              InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
     
              // 2.创建SqlSessionFactoryBuilder对象
              SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
     
              // 3.构建SqlSessionFactory对象
              SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
     
              // 4.获取SqlSession对象
              SqlSession sqlSession = sqlSessionFactory.openSession();
     
              // 5.获得dao接口的代理对象
              UserDao userDao = sqlSession.getMapper(UserDao.class);
     
              // 6.执行sql语句,得到结果
              List<User> list = userDao.findAll();
              for (User user : list) {
                  System.out.println("user = " + user);
              }
              sqlSession.close();//清除一级缓存
     
              System.out.println("分割线----------------------------------");
     
              SqlSession sqlSession2 = sqlSessionFactory.openSession();
              UserDao userDao2 = sqlSession2.getMapper(UserDao.class);
              userDao2.deleteById(5);// 关闭二级缓存
     
              List<User> userList2 = userDao2.findAll();
              for (User user : userList2) {
                  System.out.println(user);
              }
              // 7.释放资源
              sqlSession2.close();
          }
    ログイン後にコピー

    -テスト結果

    JavaでMybatisの2次キャッシュを使用する方法

    #上記のテスト後、2つのクエリが実行されたことが分かり、1つ目のクエリを実行した後、1次キャッシュと2次キャッシュをクローズし、2つ目のクエリを実行するとsql文が発行されたことがわかりました。したがって、この時点のデータはキャッシュではなくデータベースから取得されます。

    以上がJavaでMybatisの2次キャッシュを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:yisu.com
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート