MyBatisの学習の概要(10):MyBatisのプライマリキャッシュとセカンダリキャッシュ

1.キャッシングの概要

(1)キャッシュとは何ですか?

元々の意味は、一般的なランダムアクセスメモリよりもアクセス速度が速いタイプのRAMを指します。通常、システムのメインメモリのようなDRAMテクノロジを使用しませんが、高価ですが高速なSRAMテクノロジを使用します。プログラミングにおけるいわゆるキャッシュは
プログラムまたはシステムによって頻繁に呼び出されるオブジェクト(一時データ)をメモリに格納することです。これにより、使用時に新しい繰り返しインスタンスを作成することなく、オブジェクトをすばやく呼び出すことができます。

(2)キャッシュの意味は何ですか?

キャッシングは、データベースとの対話の数を減らすために使用されます。これにより、システムのオーバーヘッドが削減され、実行効率が向上します。

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

キャッシュされたデータに適用可能:頻繁にクエリされ、まれに変更され、データの正確性は最終結果にほとんど影響しません。

キャッシュされたデータには適用されません。頻繁に変更されるデータ。データの正確性は、最終結果に大きな影響を与えます。

2.レベル1キャッシュ

MyBatisの第1レベルのキャッシュは、実際にはsqlsessionレベルです。つまり、sqlsessionはそれ自体のレベル1のキャッシュのデータにしかアクセスできません。第1レベルのキャッシュクエリは、sqlsessionクラスの各インスタンスオブジェクトに存在します。特定のデータが初めてクエリされると、sqlsessionクラスのインスタンスオブジェクトはそのデータを第1レベルのキャッシュに格納します。このように、データの変更要求を受信する前に、クエリするデータはデータベースからのデータではなくキャッシュから取得されます。これにより、頻繁なデータベースクエリが大幅に削減され、効率が低下します。再度クエリを実行するときは、それがSqlSessionに存在するかどうか、存在する場合は直接使用します。SqlSessionオブジェクトが消えると、MyBatisのレベル1のキャッシュ情報も消えます。

画像

第1レベルのキャッシュを空にするトリガーとなる状況:

  • clearCache():キャッシュをクリアします
  • データの変更:第1レベルのキャッシュは、SqlSessionのスコープ内のキャッシュです。SqlSessionのmodify、delete、add、commit()、close()、およびその他のメソッドが呼び出されると、第1レベルのキャッシュがクリアされます。

第1レベルのキャッシュのスコープはSESSIONとSTATEMENTです。デフォルトはSESSIONです。第1レベルのキャッシュを使用しない場合は、第1レベルのキャッシュのスコープをSTATEMENTとして指定して、レベルキャッシュは、マッパーのステートメントが実行されるたびにキャッシュされます。クリアします。
第1レベルのキャッシュのスコープを変更する必要がある場合は、Mybatis構成ファイルのlocalCacheScopeで指定できます。
次のように:

<setting name="localCacheScope" value="STATEMENT"/>

3.レベル2キャッシュ

第2レベルのキャッシュは、同じ名前空間の下にあるマッパーを参照します。第2レベルのキャッシュには、マップ構造もあります。この領域は、第1レベルのキャッシュ領域です。第1レベルのキャッシュのキーは、SQLステートメント、条件、ステートメントなどの情報で構成される一意の値です。第1レベルのキャッシュの値は、クエリの結果オブジェクトです。

画像

使用手順:

(1)SqlMapperConfig.xmlでセカンダリキャッシュを開きます。

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

(2)マッパーマッピングファイルで第2レベルのキャッシュを開きます。

<cache eviction="FIFO" flushInterval="60000" size="512" 
readOnly="true"/>

プロパティの説明:

パラメータ名 属性
立ち退き 撤回戦略
flushInterval 更新間隔
サイズ 参照数
読み取り専用 読み取り専用

エビクションのさまざまなパラメータ属性について:

パラメータ名 属性
eviction = "LRU" 最近使用されていないもの:最も長く使用されていないオブジェクトを削除します。(デフォルト)
eviction = "FIFO" 先入れ先出し:オブジェクトをキャッシュに入る順序で削除します。
eviction = "SOFT" ソフト参照:ガベージコレクターのステータスとソフト参照ルールに基づいてオブジェクトを削除します。
eviction = "WEAK" 弱参照:ガベージコレクターのステータスと弱参照ルールに基づいて、オブジェクトをより積極的に削除します。

(3)現在の操作でselectタグのセカンダリキャッシュ構成をサポートするようにします(useCache = "true")

例:

(1)SqlMapperConfig.xmlでセカンダリキャッシュを開きます。

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

(2)userMapperマッピングファイルで第2レベルのキャッシュを開きます。

 <cache></cache>

(3)現在の操作でセカンダリキャッシュをサポートする

<!-- 根据id查询用户   -->
    <select id="findById" parameterType="Integer" resultType="com.day1.entity.User" useCache="true">
        select * from t_user where id = #{id}
    </select>

テスト後の実行結果は次のとおりです。 

総括する:

mybatisの第1レベルのキャッシュはSqlSessionレベルのキャッシュであり、第1レベルのキャッシュはオブジェクトをキャッシュします。データベースを更新するためのSqlSessionの送信、クローズ、およびその他の操作が発生すると、第1レベルのキャッシュは空になります。

2番目のレベルのキャッシュはSqlSessionFactoryレベルのキャッシュです。同じSqlSessionFactoryによって生成されたSqlSessionsは2番目のレベルのキャッシュを共有します。データは2番目のレベルのキャッシュに保存されます。2番目のレベルのキャッシュがヒットすると、オブジェクトはによって返されます。保存されたデータ。データをクエリする場合、クエリプロセスはレベル2キャッシュ>レベル1キャッシュ>データベースです。 

4.エラーの要約

错误信息:原因:org.apache.ibatis.cache.CacheException:オブジェクトのシリアル化中にエラーが発生しました。原因:java.io.NotSerializableException:com.day1.entity.User

理由:エンティティークラスUserがシリアル化インターフェースを実装していません。MyBatiaのセカンダリキャッシュにはデータが格納されており、オブジェクトを作成するにはデータを逆シリアル化する必要があります。

解決策:ユーザーにシリアル化インターフェースを実装させます。

おすすめ

転載: blog.csdn.net/weixin_47382783/article/details/113842001