ホームページ >Java >&#&チュートリアル >クエリキャッシュとは何ですか? MyBatis クエリ キャッシュの使用法の概要
転載する場合は出典を明記してください:
前述の通り: Spring+SpringMVC+MyBatis の徹底学習と構築 (7) - MyBatis の遅延読み込み
mybatis はデータベースの負荷を軽減するためにクエリ キャッシュを提供します。 、データベースのパフォーマンスが向上します。
mybatis は、一次キャッシュと二次キャッシュを提供します。
1次キャッシュはSqlSessionレベルのキャッシュです。データベースを操作する際には、sqlSessionオブジェクトを構築する必要があり、そのオブジェクト内にキャッシュデータを格納するためのデータ構造体(HashMap)が存在します。異なるsqlSession間のキャッシュデータ領域(HashMap)は相互に影響しません。
2 次キャッシュはマッパーレベルのキャッシュです。複数の sqlSession は同じマッパーの SQL ステートメントを操作します。2 次キャッシュは sqlSession にまたがります。
なぜキャッシュを使用するのですか?
キャッシュにデータがある場合、データベースからデータを取得する必要がないため、システムのパフォーマンスが大幅に向上します。
ユーザー ID 1 のユーザー情報のクエリを初めて開始するときは、まず、ID 1 のユーザー情報が存在するかどうかを確認します。キャッシュされていない場合は、データベースからユーザー情報を照会します。
ユーザー情報を取得し、ユーザー情報を一次キャッシュに保存します。
sqlSession がコミット操作 (挿入、更新、削除の実行) を実行する場合、sqlSession の 1 次キャッシュをクリアします。これは、最新の情報をキャッシュに保存し、ダーティ リードを回避するためです。
ユーザー ID 1 のユーザー情報をクエリするために 2 回目に送信されるときは、まずキャッシュに ID 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(); }
はmybatisとspringを統合して正式に開発されており、トランザクションはサービス内で制御されている。
サービス メソッドには、多数の Mapper メソッド呼び出しが含まれています。
service{
//実行開始時にトランザクションを開始し、SqlSessionオブジェクトを作成します
//1回目はマッパーメソッドfindUserById(1)が呼び出されます
//2回目はマッパーメソッドfindUserById( 1) is call , fetch data from the 1次キャッシュ
//メソッドが終了し、sqlSessionがクローズされる
}
同じユーザー情報を問い合わせるために2つのサービスコールが実行された場合、1次キャッシュは使用されませんセッションメソッドが終了し、sqlSession が閉じられるため、第 1 レベルのキャッシュがクリアされます。
まず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 次キャッシュ領域に格納されます。
mybatis の二次キャッシュは、SqlMapConfig.xml で二次キャッシュのメイン スイッチを設定することに加えて、二次キャッシュも有効にする必要があります。特定のmapper.xmlにキャッシュします。
コア構成ファイル SqlMapConfig.xml に追加します:
<setting name="cacheEnabled" value="true"/>
説明 |
許可される値 |
デフォルト値 |
|
はここにあります すべて構成ファイル内のキャッシュはグローバルにオン/オフを切り替えることができます。 | 真偽 | 真 |
以上がクエリキャッシュとは何ですか? MyBatis クエリ キャッシュの使用法の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。