なぜプログラムキャッシュを使用できますか?
キャッシュの概念を初めて目:意味が速く、一般的なランダム・アクセス・メモリRAMよりも、元のアクセス速度を指し、通常はシステムのメインメモリのDRAM技術、高価なより高速SRAM技術の使用として使用されていません。私たちのプログラム、いわゆるキャッシュのために、プログラムすることで
、多くの場合、メモリに呼び出されたオブジェクト(一時的なデータ)やシステムをその使用は、新しい重複したインスタンスを作成する必要がないとき、あなたはすぐに再び呼び出すことができます。これは、システムのオーバーヘッドを削減し、効率を向上させます。
キャッシュは、キャッシュの使用を知って、将来のいくつかの理解は、データベースの相互作用の数を削減し、効率を改善することである必要があります。その後、次の質問が来ました。データ・キャッシュのどのような種類を使用することができ、データの種類を使用することはできませんか?
それを、私たちは物事のキャッシュを使用する必要があることは明らかである実際には、データキャッシュに適用されます。定期的なクエリと頻繁に変更しないと、データが正しいかどうか、最終的な結果は、ほとんど影響があり、キャッシュされたデータには適用されません。多くの場合、データの変更、最終的にデータの正確
大きな影響をもたらします。
それがクリアされたときにキャッシュ、どのような効果の後にキャッシュは、データをキャッシュされたものを最終的にキャッシュと二次キャッシュでMyBatisの?
キャッシュ:それは私たちがクエリを実行すると、クエリ結果はまた、我々は再び照会する領域の構造は、地図である、と私たちを提供するために、地域のSQLSESSIONを格納する、MyBatisのSQLSESSIONキャッシュされたオブジェクトを参照します同じデータが、MyBatisのは、う
、直接SQLSESSIONオブジェクトが消えたときに、キャッシュMyBatisのが消えます、と出て、そこにあるかどうかをキャッシュがキャッシュSQLSESSIONの範囲にあるときにSQLSESSIONを呼び出すときに、SQLSESSIONクエリを行きますなど、変更、追加、削除、コミット()、クローズ
メソッドは、それがキャッシュをクリアする時期。
二次キャッシュ:彼は同じSqlSessionFactoryオブジェクトによって作成されたSqlSessionFactoryオブジェクト内のキャッシュMyBatisのは、そのキャッシュを共有SQLSESSION、しかし、ここで二次キャッシュクエリ結果からキャッシュデータではなく、オブジェクトが、再びオブジェクトとの出る価値がある
最初の預金オブジェクトが同じではありません。
簡単な例でキャッシュと二次キャッシュを理解深めます。
キャッシュ
1.ユーザークラス
パブリック クラスユーザーが実装Serializableを{ プライベート整数のIDを、 プライベート文字列のユーザ名。 プライベート日の誕生日。 プライベート文字列のセックス。 プライベート文字列のアドレス。 和集合の方法を取得省略..... }
2.Dao层
パブリック インターフェイスUserDao { / ** *すべてのユーザのクエリ * * @return * / リスト <ユーザ> のfindAll(); / ** *ユーザーのクエリID * * @return * / ユーザーfindById(ID整数); / ** *更新ユーザー * @paramのユーザー * / 無効updateUser(ユーザのユーザ); }
3.UserDao.xmlマッピングファイル
< マッパー名前空間= "com.example.dao.UserDao" > <は選択のid = "findAllの" resultTypeと= "com.example.domain.User" > SELECT * FROM USER。 </ 選択> < 選択ID = "findById" resultTypeと= "com.example.domain.User" のParameterType = "INT" > SELECT * FROM USER ID =#{ID} </ 選択> < 更新ID = "updateUser" ParameterType = "com.example.domain.User" 設定> < もしテスト= "ユーザ名!= nullの" >ユーザー名=#{ユーザー名}、</ 場合> < もしテスト= "パスワード!= nullの" >誕生日=#{誕生日}、</ 場合> < もしテスト= "性別!= NULL" >性別=#{性別} </ 場合> < もしテスト= "アドレス!= NULL" >アドレス=#{アドレス} </ 場合> </ 設定> ここで、ID =#{ID } </ 更新> </ マッパー>
MyBatisの動作であり、単一のテーブルで上記の3つのステップでは、次のような違いが効果を取るかしないかをユーザの操作により、ユーザIDに基づいてキャッシュクエリを観察しました
4.テスト
(1)キャッシュヒットケース
テストコードを:
@Test 公共 ボイドfindByIdTest(){ セッション = factory.openSession(); userDao = session.getMapper(UserDao。クラス); // ユーザが取得初めて ユーザーUSER1 = userDao.findById(45 ) のSystem.out.println (USER1); ユーザーを得るために二回目 のユーザUSER2 = userDao.findById(45 ) のSystem.out.println(USER2) のSystem.out.println(USER1 == USER2); Session.close(); }
テスト結果:
(2)キャッシュSQLSESSION動作、クリア即ち、キャッシュ、再度試験をクリアします。
@Test 公共 ボイドfindByIdTest(){ セッション = factory.openSession(); userDao = session.getMapper(UserDao。クラス); ユーザーUSER1 = userDao.findById(45 ) のSystem.out.println(USER1); // セッション。コミット();メソッドのコミットSQLSESSION空のキャッシュを呼び出し user1.setUsername( "更新のユーザーを" ); user1.setAddress( "更新アドレス" ); userDao.updateUser(USER1); // SQLSESSION空のキャッシュ更新することにより 、ユーザuser2の= userDaoを。 findById(45 ) のSystem.out.println(USER2)。 のSystem.out.println(USER1 ==USER2); session.close(); }
キャッシュ操作をたくさん空に、あなたは、tryを持つことができます。テスト結果:
二次キャッシュ
Dao.xmlに(現在のマッピングファイルのサポート第二レベルキャッシュように、(MyBatisのメイン設定ファイルで構成された)二次キャッシュが使用されるMyBatisの、MyBatisのフレームワークを作成する最初のステップは、二次キャッシュをサポートする方法の第2ステップを見てマッピングファイルの構成)、第三のステップ現在の方法は、ラベルで構成二次キャッシュ()をサポートするようになっています。変換方式を設定するためにユーザに上記クエリインタフェースのこの工程によれば、二次キャッシュをサポートすることができます。
1.支持枠二次キャッシュ構成MyBatisの
< 設定名= "cacheEnabled" 値= "true"を/>
2. [設定UserDao.xmlは二次キャッシュをサポート
< キャッシュ/>
3.設定したクエリのサポート、二次キャッシュ
< 選択ID = "findById" resultTypeと= "com.example.domain.User" のParameterType = "INT" useCache = "真" > SELECT * FROM USER ID =#{ID} </ 選択>
4.テスト
@Test 公共 ボイドfindByIdTest(){ // 最初のクエリーと二次キャッシュを更新 SQLSESSION =セッション1 factory.openSession(); UserDao userDao1 = session1.getMapper(UserDao クラス;) ユーザーUSER1(45 = userDao1.findById )。 System.out.println(USER1); session1.commit(); // commit()メソッドは、二次キャッシュバッファに提出同時に空に )(session1.closeを; // // user1.setUsername( "更新のユーザー")。 // user1.setAddress( "更新アドレス"); // userDao.updateUser(USER1); // SQLSESSIONを更新することにより、キャッシュを空にする // 第二の二次キャッシュルックアップがヒット SQLSESSIONセッション2 = factory.openSessionを(); UserDao userDao2 = session2.getMapper(。UserDao クラス); ユーザuser2が = userDao2.findById(45 ); session2.commit(); //は、コミット()キャッシュ提出同時に空に二次キャッシュの方法 session2.closeを(); // のSystem.out.println(USER2) のSystem.out.println(USER1 == USER2); }
テスト結果:
概要:、キャッシュはSQLSESSIONレベルのキャッシュであるMyBatisのキャッシュは、オブジェクトのキャッシュされ、データベースを更新するSQLSESSION提出、決算、および他の操作が発生した場合、キャッシュがクリアされます。二次キャッシュはSqlSessionFactoryレベルキャッシュである、SQLSESSION同じSqlSessionFactory共有発生二次キャッシュが、キャッシュに格納されたデータ、二場合、二次キャッシュヒット、オブジェクト・ストレージによって返されたデータ構造。クエリデータは、クエリを処理するとき、二次キャッシュ>キャッシュ>データベースです。