ホームページ  >  記事  >  Java  >  クエリキャッシュとは何ですか? MyBatis クエリ キャッシュの使用法の概要

クエリキャッシュとは何ですか? MyBatis クエリ キャッシュの使用法の概要

零下一度
零下一度オリジナル
2017-06-25 10:56:072296ブラウズ

転載する場合は出典を明記してください:

前述の通り: Spring+SpringMVC+MyBatis の徹底学習と構築 (7) - MyBatis の遅延読み込み

1. クエリ キャッシュとは

mybatis はデータベースの負荷を軽減するためにクエリ キャッシュを提供します。 、データベースのパフォーマンスが向上します。

mybatis は、一次キャッシュと二次キャッシュを提供します。

1次キャッシュはSqlSessionレベルのキャッシュです。データベースを操作する際には、sqlSessionオブジェクトを構築する必要があり、そのオブジェクト内にキャッシュデータを格納するためのデータ構造体(HashMap)が存在します。異なるsqlSession間のキャッシュデータ領域(HashMap)は相互に影響しません。

2 次キャッシュはマッパーレベルのキャッシュです。複数の sqlSession は同じマッパーの SQL ステートメントを操作します。2 次キャッシュは sqlSession にまたがります。

なぜキャッシュを使用するのですか?

キャッシュにデータがある場合、データベースからデータを取得する必要がないため、システムのパフォーマンスが大幅に向上します。

2. 一次キャッシュ

2.1 一次キャッシュの動作原理

ユーザー ID 1 のユーザー情報のクエリを初めて開始するときは、まず、ID 1 のユーザー情報が存在するかどうかを確認します。キャッシュされていない場合は、データベースからユーザー情報を照会します。

ユーザー情報を取得し、ユーザー情報を一次キャッシュに保存します。

sqlSession がコミット操作 (挿入、更新、削除の実行) を実行する場合、sqlSession の 1 次キャッシュをクリアします。これは、最新の情報をキャッシュに保存し、ダーティ リードを回避するためです。

ユーザー ID 1 のユーザー情報をクエリするために 2 回目に送信されるときは、まずキャッシュに ID 1 のユーザー情報があるかどうかを調べます。キャッシュに存在する場合は、キャッシュからユーザー情報を直接取得します。

2.2 レベル 1 キャッシュ テスト

Mybatis はデフォルトでレベル 1 キャッシュをサポートしており、構成ファイルで構成する必要はありません。

上記の 1 次キャッシュの原則の手順に従ってテストしてください。

    @Testpublic void testCache1() throws Exception{
        SqlSession sqlSession=sqlSessionFactory.openSession();
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);//下边查询使用一个SqlSession//第一次发起请求,查询id为1的用户User user1=userMapper.findUserById(1);
        System.out.println(user1);        //如果sqlSession去执行commit操作(执行插入、更新、删除),清空sqlSession中的一级缓存,//这样做的目的是为了让缓存中存储的是最新的信息,避免脏读。//更新user1的信息user1.setUsername("测试用户22");
        userMapper.updateUser(user1);//执行commit操作去清空缓存        sqlSession.commit();        //第二次发起请求,查询id为1的用户User user2=userMapper.findUserById(1);
        System.out.println(user2);

        sqlSession.close();
    }

2.3 レベル1キャッシュアプ​​リケーション

はmybatisとspringを統合して正式に開発されており、トランザクションはサービス内で制御されている。

サービス メソッドには、多数の Mapper メソッド呼び出しが含まれています。

service{

//実行開始時にトランザクションを開始し、SqlSessionオブジェクトを作成します

//1回目はマッパーメソッドfindUserById(1)が呼び出されます

//2回目はマッパーメソッドfindUserById( 1) is call , fetch data from the 1次キャッシュ

//メソッドが終了し、sqlSessionがクローズされる

}

同じユーザー情報を問い合わせるために2つのサービスコールが実行された場合、1次キャッシュは使用されませんセッションメソッドが終了し、sqlSession が閉じられるため、第 1 レベルのキャッシュがクリアされます。

3. 2次キャッシュ

3.1 2次キャッシュの原理

まずmybatisの2次キャッシュを有効にします。

sqlSession1 は、ユーザー ID 1 のユーザー情報をクエリします。ユーザー情報をクエリした後、クエリ データは 2 次キャッシュに格納されます。

sqlSession3が同一マッパー配下でSQLを実行し、コミットサブミットを実行すると、マッパー配下の2次キャッシュ領域のデータはクリアされます。

sqlSession2 は、ユーザー ID 1 のユーザー情報をクエリし、キャッシュにデータが存在するかどうかを確認し、存在する場合はキャッシュからデータを直接取得します。

2次キャッシュと1次キャッシュの違い: 2次キャッシュの範囲が広く、複数のsqlSessionでUserMapperの2次キャッシュ領域を共有できます。 UserMapper には 2 次キャッシュ領域 (名前空間で分割) があり、他のマッパーにも独自の 2 次キャッシュ領域 (名前空間で分割) があります。

各名前空間マッパーには 2 次キャッシュ領域があります。2 つのマッパーの名前空間が同じ場合、SQL クエリを実行する 2 つのマッパーによって取得されたデータは同じ 2 次キャッシュ領域に格納されます。

3.2 二次キャッシュをオンにする

mybatis の二次キャッシュは、SqlMapConfig.xml で二次キャッシュのメイン スイッチを設定することに加えて、二次キャッシュも有効にする必要があります。特定のmapper.xmlにキャッシュします。

コア構成ファイル SqlMapConfig.xml に追加します:

<setting name="cacheEnabled" value="true"/>
cacheEnabled

在UserMapper.xml中开启二级缓存,UserMapper.xml下的sql执行完成后存储在它的缓存区域(HashMap)。

3.3调用pojo类实现序列化接口

为了将缓存数据取出执行反序列划操作,因为二级缓存数据存储介质多种多样,不一定在内存。可能在硬盘、远程等。

3.4测试方法

    @Testpublic void testCache2() throws Exception{
        SqlSession sqlSession1=sqlSessionFactory.openSession();
        SqlSession sqlSession2=sqlSessionFactory.openSession();
        SqlSession sqlSession3=sqlSessionFactory.openSession();
        
        UserMapper userMapper1=sqlSession1.getMapper(UserMapper.class);
        UserMapper userMapper2=sqlSession2.getMapper(UserMapper.class);
        UserMapper userMapper3=sqlSession3.getMapper(UserMapper.class);        //第一次发起请求,查询id为1的用户User user1=userMapper1.findUserById(1);
        System.out.println(user1);//这里执行关闭操作,将sqlSession中的数据写到二级缓存区域        sqlSession1.close();        //使用sqlSession3执行commit()操作User user=userMapper3.findUserById(1);
        user1.setUsername("Joanna");
        userMapper3.updateUser(user);//执行提交,清空UserMapper下边的二级缓存        sqlSession3.commit();
        sqlSession3.close();        //第二次发起请求,查询id为1的用户User user2=userMapper2.findUserById(1);
        System.out.println(user2);
        sqlSession2.close();
    }

3.5禁用二级缓存

在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql,默认情况是true,即该sql使用二级缓存。

説明

許可される値

デフォルト値

はここにあります すべて構成ファイル内のキャッシュはグローバルにオン/オフを切り替えることができます。

真偽

以上がクエリキャッシュとは何ですか? MyBatis クエリ キャッシュの使用法の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。