詳解java中的二級緩存
這篇文章主要介紹了java中hibernate二級快取詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧
Hibernate的二級快取
一、快取概述
快取(Cache ): 計算機領域非常通用的概念。它介於應用程式和永久性資料儲存來源(如硬碟上的檔案或資料庫)之間,其作用是降低應用程式直接讀寫永久性資料儲存來源的頻率,從而提高應用程式的運作效能。快取中的資料是資料儲存來源中資料的拷貝。快取的實體媒體通常是記憶體
hibernate中提供了兩個層級的快取
第一層的快取是Session 層級的緩存,它是屬於交易範圍的快取。這一級別的緩存由hibernate 管理的,一般情況下無需進行幹預
第二級別的緩存是SessionFactory 級別的緩存,它是屬於進程範圍的緩存
#Hibernate 的快取可以分為兩類:
內建快取: Hibernate 自帶的, 不可卸載. 通常在Hibernate 的初始化階段, Hibernate 會把映射元數據和預先定義的SQL 語句放到SessionFactory 的快取中, 映射元資料是映射檔案中資料的複製, 而預定義SQL 語句時Hibernate 根據映射元資料推到出來的. 該內建快取是只讀的.
外部快取(二級快取): 一個可設定的快取外掛. 在預設情況下, SessionFactory 不會啟用這個快取外掛. 外接快取中的資料是資料庫資料的複製, 外置快取的實體媒體可以是記憶體或硬碟
二、理解二級快取的並發存取策略
三、設定進程範圍內的二級快取(配置ehcache快取)
1 拷貝ehcache-1.5.0.jar到目前工程的lib目錄下
依賴backport-util-concurrent 和commons-logging
2 開啟二級快取
<property name="hibernate.cache.use_second_level_cache">true</property>
3 要指定快取的供應商
<property name="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider</property>
4 指定使用二級快取的類別
方法一在使用類別的*.hbm.xml配置
選擇需要使用二級快取的持久化類別, 設定它的二級快取的並發存取策略,
方法二 在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>
四、測試
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(); } }
【相關推薦】
1. 特別推薦:「php程式設計師工具箱」V0.1版本下載
2. Java免費影片教學
3. JAVA教學手冊
以上是詳解java中的二級緩存的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

mybatis的一級快取是預設開啟的,並且是SqlSession等級的。這意味著同一SqlSession中的多次查詢會利用到該層級的快取。一級快取主要儲存的是查詢結果。當執行查詢操作時,MyBatis會將映射語句和查詢結果的對應關係以及查詢結果資料儲存在快取中。 mybatis的二級快取與一級快取不同,二級快取在整個應用程式中是共享的,不像一級快取在每個SqlSession等等。

MyBatis的快取機制解析:一級快取與二級快取的差異與應用在MyBatis框架中,快取是一個非常重要的特性,可以有效提升資料庫操作的效能。其中,一級快取和二級快取是MyBatis常用的兩種快取機制。本文將詳細解析一級快取與二級快取的差異與應用,並提供具體的程式碼範例進行說明。一、一級緩存一級緩存也被稱為本地緩存,它預設開啟且不可關閉。一級快取是SqlSes

在SpringBoot專案中整合Hibernate前言Hibernate是一個流行的ORM(物件關係映射)框架,它可以將Java物件映射到資料庫表,從而方便地進行持久化操作。在SpringBoot專案中,整合Hibernate可以幫助我們更輕鬆地進行資料庫操作,本文將介紹如何在SpringBoot專案中整合Hibernate,並提供相應的範例。 1.引入依賴在pom.xml檔案中引入以下依賴:org.springframework.bootspring-boot-starter-data-jpam

Java是一種物件導向程式語言,它被廣泛地應用於軟體開發領域。 Hibernate是一種流行的Java持久化框架,它提供了一種簡單且高效的方式來管理Java物件的持久化。然而,開發過程中經常會遇到Hibernate錯誤,這些錯誤可能會導致程式的異常終止或不穩定。如何處理和避免Hibernate錯誤成為了Java開發者必須掌握的能力。本文將介紹一些常見的Hib

hibernate和mybatis的差別:1、實作方式;2、效能;3、物件管理的比較;4、快取機制。詳細介紹:1、實作方式,Hibernate是一個完整的物件/關係映射解決方案,將物件與資料庫表進行映射,MyBatis則需要開發者手動編寫SQL語句以及ResultMap;2、效能,Hibernate在開發速度上可能比MyBatis快,因為Hibernate簡化了DAO層等等。

Hibernate的一對多和多對多Hibernate是一個優秀的ORM框架,它簡化了Java應用程式與關係型資料庫之間的資料存取。在Hibernate中,我們可以使用一對多和多對多的關係來處理複雜的資料模型。 Hibernate的一對多在Hibernate中,一對多關係是指一個實體類別對應多個另一個實體類別。例如,一個訂單(Order)可以對應多個訂單項目(OrderItem),一個使用者(User)可以對應多個訂單(Order)。要在Hibernate中實作一對多關係,需要在實體類別中定義一個集合屬性來存

mybatis二級快取配置的步驟:1、開啟二級快取;2、配置二級快取;3、指定快取的並發等級;4、使用二級快取;5、清空二級快取。 MyBatis提供了二級快取功能,用於提高查詢效能,二級快取是跨多個SQL Session的緩存,它可以減少對資料庫的存取次數,提高應用程式的效能。在使用二級快取時需要注意執行緒安全性問題,確保多個執行緒不會同時修改同一份資料。

隨著網路的普及和資訊化進程的加速,資料量呈現爆發式成長,使得我們在開發過程中遇到的問題也愈發複雜。而快取技術的出現則成為了一個非常好的解決方案,它們能夠提升系統的效能和可靠性。在這些技術中,二級快取直接參與到應用程式中來,為我們提供了許多實用價值。本文將介紹Java快取技術中的二級快取。一.什麼是快取技術?快取技術是電腦領域中常用的一種效能最佳化方法,
