この記事は主に Java の Hibernate 2 次キャッシュの詳細な説明を紹介しています。編集者が非常に優れていると考えたので、参考として共有します。エディターをフォローして見てみましょう
Hibernate の 2 次キャッシュ
1. キャッシュの概要
キャッシュ (Cache): コンピューター分野では非常に一般的な概念です。これは、アプリケーションと永続データ ストレージ ソース (ハードディスク上のファイルやデータベースなど) の間に配置され、アプリケーションが永続データ ストレージ ソースを直接読み書きする頻度を減らし、実行パフォーマンスを向上させます。アプリケーションの。キャッシュ内のデータは、データ ストレージ ソース内のデータのコピーです。通常、キャッシュの物理媒体はメモリです。Hibernate は 2 つのレベルのキャッシュを提供します。最初のレベルのキャッシュは、トランザクション全体のキャッシュです。このレベルのキャッシュは Hibernate によって管理され、通常は介入は必要ありません。第 2 レベルのキャッシュは、プロセス全体のキャッシュであり、次の 2 つのカテゴリに分類できます。キャッシュ: Hibernate は付属しており、アンインストールできません。通常、Hibernate の初期化フェーズ中に、Hibernate はマッピング メタデータと事前定義された SQL ステートメントを SessionFactory キャッシュに置きます。マッピング メタデータはマッピング ファイル内のデータであり、事前定義された SQL です。ステートメントはマッピング メタデータに基づいて Hibernate によってプッシュされます。 組み込みキャッシュは読み取り専用です。
外部キャッシュ (第 2 レベルのキャッシュ): デフォルトでは、SessionFactory はこのキャッシュ プラグインを有効にしません。 -in。外部キャッシュ内のデータはデータベース データのコピーであり、外部キャッシュの物理媒体はメモリまたはハードディスクです
3. プロセス全体の 2 次キャッシュを構成します (ehcache キャッシュを構成します)
1 ehcache-1.5.0.jar を現在のプロジェクトの lib ディレクトリにコピーします
バックポートに応じてutil-con
とcommons-logging
2 2次キャッシュをオンにする
<property name="hibernate.cache.use_second_level_cache">true</property>
3 キャッシュプロバイダーを指定するには <property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider</property>
4 2次キャッシュを使用するクラスを指定する
方法1は、 *.hbm.xml クラスの設定
2 次キャッシュを使用する必要がある永続クラスを選択し、その 2 次キャッシュの同時アクセス ポリシーを設定します。 06fc722e8309f4fc3af5f9b05c0cd286 のキャッシュ サブ要素。要素は、Hibernate が オブジェクト
の単純なプロパティ
をキャッシュしますが、コレクション属性をキャッシュしたい場合は、62aecd17e676a41d3547c3bf97bb07b0 サブ要素を追加する必要があることを示します。 5a9c31804c75b3b74adac946f50af902 要素方法 2 hibernate.cfg.xml ファイルで設定する (推奨)
<!-- 指定使用二级缓存的类 放在maping下面 --> <!-- 配置类级别的二级缓存 --> <class-cache class="com.sihai.c3p0.Customer" usage="read-write"/> <class-cache class="com.sihai.c3p0.Order" usage="read-write"/> <!-- 配置集合级别的二级缓存 --> <collection-cache collection="com.sihai.c3p0.Customer.orders" usage="read-write"/>5 設定 ehcache のデフォルトの
設定ファイル
ehcache.xml (固定名) (クラスパスの下に配置)<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="c:/ehcache"/> <defaultCache maxElementsInMemory="5" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" /> </ehcache>
4. テスト
package com.sihai.hibernate3.test; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import com.sihai.hibernate3.demo1.Customer; import com.sihai.hibernate3.demo1.Order; import com.sihai.utils.HibernateUtils; public class HibernateTest6 { @Test // 查询缓存的测试 public void demo9(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Query query = session.createQuery("select c.cname from Customer c"); // 使用查询缓存: query.setCacheable(true); query.list(); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); query = session.createQuery("select c.cname from Customer c"); query.setCacheable(true); query.list(); tx.commit(); } @SuppressWarnings("unused") @Test // 更新时间戳 public void demo8(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class, 2); session.createQuery("update Customer set cname = '奶茶' where cid = 2").executeUpdate(); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer2 = (Customer) session.get(Customer.class, 2); tx.commit(); } @SuppressWarnings("all") @Test // 将内存中的数据写到硬盘 public void demo7(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); List<Order> list = session.createQuery("from Order").list(); tx.commit(); } @Test // 一级缓存的更新会同步到二级缓存: public void demo6(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class, 1); customer.setCname("芙蓉"); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer2 = (Customer) session.get(Customer.class, 1); tx.commit(); } @SuppressWarnings("unchecked") @Test // iterate()方法可以查询所有信息. // iterate方法会发送N+1条SQL查询.但是会使用二级缓存的数据 public void demo5(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); // N+1条SQL去查询. Iterator<Customer> iterator = session.createQuery("from Customer").iterate(); while(iterator.hasNext()){ Customer customer = iterator.next(); System.out.println(customer); } tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); iterator = session.createQuery("from Customer").iterate(); while(iterator.hasNext()){ Customer customer = iterator.next(); System.out.println(customer); } tx.commit(); } @SuppressWarnings("unchecked") @Test // 查询所有.Query接口的list()方法. // list()方法会向二级缓存中放数据,但是不会使用二级缓存中的数据. public void demo4(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); // 查询所有客户: // list方法会向二级缓存中放入数据的. List<Customer> list = session.createQuery("from Customer").list(); for (Customer customer : list) { System.out.println(customer.getCname()); } tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); // Customer customer = (Customer) session.get(Customer.class, 1);// 没有发生SQL ,从二级缓存获取的数据. // list()方法没有使用二级缓存的数据. list = session.createQuery("from Customer").list(); for (Customer customer : list) { System.out.println(customer.getCname()); } tx.commit(); } @Test // 二级缓存的集合缓冲区特点: public void demo3(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class, 1); // 查询客户的订单. System.out.println("订单的数量:"+customer.getOrders().size()); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer2 = (Customer) session.get(Customer.class, 1); // 查询客户的订单. System.out.println("订单的数量:"+customer2.getOrders().size()); tx.commit(); } @SuppressWarnings("unused") @Test // 配置二级缓存的情况 public void demo2(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer1 = (Customer) session.get(Customer.class, 1);// 发送SQL. Customer customer2 = (Customer) session.get(Customer.class, 1);// 不发送SQL. System.out.println(customer1 == customer2); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer3 = (Customer) session.get(Customer.class, 1);// 不发送SQL. Customer customer4 = (Customer) session.get(Customer.class, 1);// 不发送SQL. System.out.println(customer3 == customer4); tx.commit(); } @SuppressWarnings("unused") @Test // 没有配置二级缓存的情况 public void demo1(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer1 = (Customer) session.get(Customer.class, 1);// 发送SQL. Customer customer2 = (Customer) session.get(Customer.class, 1);// 不发送SQL. tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer3 = (Customer) session.get(Customer.class, 1);// 发送SQL. tx.commit(); } }
[関連する推奨事項]
特別な推奨事項: "php "Programmer's Toolbox" V0.1 バージョンのダウンロード
2.Java 無料ビデオ チュートリアル
3. JAVA チュートリアル マニュアル
以上がJavaの2次キャッシュについて詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。