Mybatis での 1 レベル キャッシュと 2 レベル キャッシュの遅延読み込み

Mybatis での遅延読み込み

問題: 1 対多では、ユーザーが 1 人の場合、アカウントは 100 個になります。
ユーザーにクエリを実行するときに、関連付けられているアカウントを調べたいですか?
アカウントをクエリするときに、関連付けられているユーザーを調べたいですか?

ユーザーを照会するときは、そのユーザーのアカウント情報を、いつ使用するか、いつ照会するかを指定する必要があります。
アカウントを照会する場合、アカウントのユーザー情報もアカウント照会と一緒に照会する必要があります。

遅延読み込みとは何ですか

データが実際に使用されるときにクエリを開始し、使用されていないときはクエリを実行しないでください。オンデマンドでのロード (遅延ロード)

インスタントロードとは何ですか

使用されているかどうかに関係なく、メソッドが呼び出されている限り、クエリはすぐに開始されます。

テーブルのリレーションシップの場合:
1 対多、多対多: 通常は遅延ロードを使用します。
多対 1、1 対 1: 通常は即時ロードを使用します。

ここに画像の説明を挿入
SqlMapConfig で構成可能

    <settings>
        <!-- 开启Mybatis支持延迟加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

Mybatisのキャッシュ

キャッシュとは何ですか

メモリ上に存在する一時的なデータ

キャッシングを使用する理由

データベースとのやり取りの数を減らし、実行効率を向上させます。

キャッシュに適したデータ

頻繁にクエリが実行され、変更はほとんどないため、
データの正確性は最終結果にほとんど影響しません。

キャッシュに適したデータ

データが頻繁に変更される
データの正確さが最終結果に大きな影響を与える
例: 商品在庫、銀行為替レート、株式市場価格

Mybatisのレベル1キャッシュ

レベル 1 キャッシュ: Mybatis の SqlSession オブジェクトのキャッシュを指します
。クエリを実行すると、クエリの結果は SqlSession が提供する領域に同時に格納されます。
この領域の構造は Map です。同じデータを再度クエリすると、mybatis はまず SqlSession にアクセスして存在するかどうかを確認し、SqlSession オブジェクトが
消えたときにそれを直接使用します。mybatis の 1 次キャッシュも消えます。

ここに画像の説明を挿入

レベル 1 キャッシュの分析

一次キャッシュはSqlSessionのスコープ内のキャッシュであり、SqlSessionの変更、追加、削除、commit()、close()などのメソッドが呼び出されると、一次キャッシュはクリアされます。
ここに画像の説明を挿入

第一次发起查询用户 id 为 1 的用户信息,先去找缓存中是否有 id 为 1 的用户信息,如果没有,从数据库查 询用户信息。 
得到用户信息,将用户信息存储到一级缓存中。  
如果 sqlSession 去执行 commit 操作(执行插入、更新、删除),清空 SqlSession 中的一级缓存,这样 做的目的为了让缓存中存储的是最新的信息,避免脏读。
第二次发起查询用户 id 为 1 的用户信息,先去找缓存中是否有 id 为 1 的用户信息,缓存中有,直接从缓存 中获取用户信息。

Mybatisの2次キャッシュ

2 次キャッシュ: Mybatis の SqlSessionFactory オブジェクトのキャッシュを指します。同じ SqlSessionFactory オブジェクトによって作成された SqlSessions はキャッシュを共有します。
2次キャッシュを使用する手順

最初のステップ: Mybatis フレームワークに 2 次キャッシュをサポートさせます (SqlMapConfig.xml で構成)
ここに画像の説明を挿入
2 番目のステップ: 現在のマッピング ファイルで 2 次キャッシュをサポートさせます (IUserDao.xml で構成)
ここに画像の説明を挿入
3 番目のステップ: 現在のマッピング ファイルをサポートさせます操作サポートの第 2 レベルのキャッシュ (select タグで構成)
ここに画像の説明を挿入

2次キャッシュの解析

ここに画像の説明を挿入

まずmybatisの2次キャッシュを開きます。

sqlSession1 を使用してユーザー情報をクエリします。ユーザー情報がクエリされると、クエリ データは 2 次キャッシュに保存されます。

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

sqlSession2 が sqlSession1 と同じユーザー情報をクエリする場合、まずキャッシュにアクセスしてデータがあるかどうかを確認し、データがある場合はキャッシュからデータを直接フェッチします。

2 次キャッシュを使用する場合、オブジェクトをシリアル化された方法で格納できるように、キャッシュされたクラスは java.io.Serializable インターフェースを実装する必要があります。

おすすめ

転載: blog.csdn.net/weixin_42727032/article/details/104481381