ホームページ Java &#&チュートリアル Javaの2次キャッシュについて詳しく解説

Javaの2次キャッシュについて詳しく解説

May 16, 2017 am 09:59 AM
hibernate L2キャッシュ

この記事は主に Java の Hibernate 2 次キャッシュの詳細な説明を紹介しています。編集者が非常に優れていると考えたので、参考として共有します。エディターをフォローして見てみましょう

Hibernate の 2 次キャッシュ

1. キャッシュの概要

キャッシュ (Cache): コンピューター分野では非常に一般的な概念です。これは、アプリケーションと永続データ ストレージ ソース (ハードディスク上のファイルやデータベースなど) の間に配置され、アプリケーションが永続データ ストレージ ソースを直接読み書きする頻度を減らし、実行パフォーマンスを向上させます。アプリケーションの。キャッシュ内のデータは、データ ストレージ ソース内のデータのコピーです。通常、キャッシュの物理媒体はメモリです。Hibernate は 2 つのレベルのキャッシュを提供します。最初のレベルのキャッシュは、トランザクション全体のキャッシュです。このレベルのキャッシュは Hibernate によって管理され、通常は介入は必要ありません。第 2 レベルのキャッシュは、プロセス全体のキャッシュであり、次の 2 つのカテゴリに分類できます。キャッシュ: Hibernate は付属しており、アンインストールできません。通常、Hibernate の初期化フェーズ中に、Hibernate はマッピング メタデータと事前定義された SQL ステートメントを SessionFactory キャッシュに置きます。マッピング メタデータはマッピング ファイル内のデータであり、事前定義された SQL です。ステートメントはマッピング メタデータに基づいて Hibernate によってプッシュされます。 組み込みキャッシュは読み取り専用です。

外部キャッシュ (第 2 レベルのキャッシュ): デフォルトでは、SessionFactory はこのキャッシュ プラグインを有効にしません。 -in。外部キャッシュ内のデータはデータベース データのコピーであり、外部キャッシュの物理媒体はメモリまたはハードディスクです

2. 2 次キャッシュの同時アクセス戦略を理解する


3. プロセス全体の 2 次キャッシュを構成します (ehcache キャッシュを構成します)
1 ehcache-1.5.0.jar を現在のプロジェクトの lib ディレクトリにコピーします


バックポートに応じてutil-con

current

と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 次キャッシュの同時アクセス ポリシーを設定します。 のキャッシュ サブ要素。要素は、Hibernate が オブジェクト

の単純な

プロパティ
をキャッシュしますが、コレクション属性をキャッシュしたい場合は、 サブ要素を追加する必要があることを示します。 <

set

> 要素方法 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 = &#39;奶茶&#39; 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(); 
 } 
}
ログイン後にコピー

[関連する推奨事項]

1.

特別な推奨事項: "php "Programmer's Toolbox" V0.1 バージョンのダウンロード

2.

Java 無料ビデオ チュートリアル

3. JAVA チュートリアル マニュアル

以上がJavaの2次キャッシュについて詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

mybatisの一次キャッシュと二次キャッシュとは何ですか? mybatisの一次キャッシュと二次キャッシュとは何ですか? Jan 15, 2024 pm 01:44 PM

Mybatis の 1 次キャッシュはデフォルトで有効になっており、SqlSession レベルになります。これは、同じ SqlSession 内の複数のクエリがこのレベルのキャッシュを利用することを意味します。 1 次キャッシュには主にクエリ結果が保存されます。クエリ操作を実行すると、MyBatis はマッピング ステートメントとクエリ結果の間のマッピング関係、およびクエリ結果データをキャッシュに保存します。 mybatisの2次キャッシュは1次キャッシュとは異なり、SqlSessionごとの1次キャッシュとは異なり、アプリケーション全体で共有されます。

MyBatisのキャッシュ機構を解析:一次キャッシュと二次キャッシュの特徴と使い方を比較 MyBatisのキャッシュ機構を解析:一次キャッシュと二次キャッシュの特徴と使い方を比較 Feb 25, 2024 pm 12:30 PM

MyBatis のキャッシュ メカニズムの分析: 1 次キャッシュと 2 次キャッシュの違いと応用 MyBatis フレームワークでは、キャッシュはデータベース操作のパフォーマンスを効果的に向上させることができる非常に重要な機能です。そのうち、一次キャッシュと二次キャッシュは、MyBatis でよく使用される 2 つのキャッシュ メカニズムです。この記事では、一次キャッシュと二次キャッシュの違いと用途を詳細に分析し、具体的なコード例を示して説明します。 1. レベル 1 キャッシュ レベル 1 キャッシュはローカル キャッシュとも呼ばれ、デフォルトで有効になっており、オフにすることはできません。 1次キャッシュはSqlSesです

SpringBoot プロジェクトに Hibernate を統合する方法 SpringBoot プロジェクトに Hibernate を統合する方法 May 18, 2023 am 09:49 AM

SpringBoot プロジェクトへの Hibernate の統合 はじめに Hibernate は、Java オブジェクトをデータベース テーブルにマップして永続化操作を容易にする、人気のある ORM (オブジェクト リレーショナル マッピング) フレームワークです。 SpringBoot プロジェクトでは、Hibernate を統合すると、データベース操作をより簡単に実行できるようになります。この記事では、SpringBoot プロジェクトに Hibernate を統合する方法と、対応する例を示します。 1.依存関係の導入pom.xml ファイルに次の依存関係を導入します: org.springframework.bootspring-boot-starter-data-jpam

Java エラー: Hibernate エラー、処理方法と回避方法 Java エラー: Hibernate エラー、処理方法と回避方法 Jun 25, 2023 am 09:09 AM

Java は、ソフトウェア開発の分野で広く使用されているオブジェクト指向プログラミング言語です。 Hibernate は、Java オブジェクトの永続性を管理するためのシンプルかつ効率的な方法を提供する、人気のある Java 永続性フレームワークです。ただし、開発プロセス中に Hibernate エラーが発生することが多く、これらのエラーによりプログラムが異常終了したり、不安定になったりする可能性があります。 Hibernate エラーを処理および回避する方法は、Java 開発者が習得しなければならないスキルとなっています。この記事では一般的な Hib を紹介します。

Java Hibernate における 1 対多および多対多の関係のマッピング方法は何ですか? Java Hibernate における 1 対多および多対多の関係のマッピング方法は何ですか? May 27, 2023 pm 05:06 PM

Hibernate の 1 対多および多対多 Hibernate は、Java アプリケーションとリレーショナル データベース間のデータ アクセスを簡素化する優れた ORM フレームワークです。 Hibernate では、1 対多および多対多の関係を使用して、複雑なデータ モデルを処理できます。 Hibernate の 1 対多 Hibernate では、1 対多の関係は、1 つのエンティティ クラスが他の複数のエンティティ クラスに対応することを意味します。たとえば、1 つの注文は複数の注文アイテム (OrderItem) に対応することができ、1 人のユーザー (User) は複数の注文 (Order) に対応することができます。 Hibernate で 1 対多の関係を実装するには、エンティティ クラスでコレクション属性を定義して格納する必要があります。

Hibernateとmybatisの違いは何ですか Hibernateとmybatisの違いは何ですか Jan 03, 2024 pm 03:35 PM

Hibernate と mybatis の違い: 1. 実装方法、2. パフォーマンス、3. オブジェクト管理の比較、4. キャッシュのメカニズム。詳細な紹介: 1. 実装方法、Hibernate はオブジェクトをデータベース テーブルにマップする完全なオブジェクト/リレーショナル マッピング ソリューションですが、MyBatis では開発者が SQL ステートメントと ResultMap を手動で記述する必要があります; 2. パフォーマンス、開発速度の点で Hibernate は可能です。 MyBatis は、Hibernate が DAO 層などを簡素化するためです。

mybatis の 2 次キャッシュを構成する方法 mybatis の 2 次キャッシュを構成する方法 Jan 11, 2024 pm 01:34 PM

mybatis の 2 次キャッシュ構成の手順: 1. 2 次キャッシュを有効にする; 2. 2 次キャッシュを構成する; 3. キャッシュの同時実行レベルを指定する; 4. 2 次キャッシュを使用する; 5. 2 次キャッシュをクリアする。 MyBatis は、クエリのパフォーマンスを向上させるための 2 次キャッシュ機能を提供します。2 次キャッシュは、複数の SQL セッションにまたがるキャッシュです。これにより、データベースへのアクセス数が削減され、アプリケーションのパフォーマンスが向上します。 2 次キャッシュを使用する場合は、複数のスレッドが同じデータを同時に変更しないように、スレッドの安全性の問題に注意する必要があります。

Java キャッシュ テクノロジの 2 次キャッシュ Java キャッシュ テクノロジの 2 次キャッシュ Jun 20, 2023 pm 12:51 PM

インターネットの普及と情報化の加速に伴い、データ量は爆発的に増加し、開発プロセスで遭遇する問題はますます複雑化しています。キャッシュ テクノロジの出現は非常に優れたソリューションとなり、システムのパフォーマンスと信頼性を向上させることができます。これらのテクノロジーの中で、2 次キャッシュはアプリケーションに直接関与し、多くの実用的な価値を提供します。この記事では、Java キャッシュ テクノロジの 2 次キャッシュについて紹介します。 1. キャッシュ技術とは何ですか?キャッシュ テクノロジは、コンピュータ分野で一般的に使用されるパフォーマンス最適化手法です。

See all articles