最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中hibernate二級緩存詳解

 更新時間:2017年05月06日 15:54:12   作者:SIHAIloveYAN  
本篇文章中主要介紹了java中hibernate二級緩存詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Hibernate的二級緩存

一、緩存概述

緩存(Cache): 計算機領域非常通用的概念。它介于應用程序和永久性數(shù)據(jù)存儲源(如硬盤上的文件或者數(shù)據(jù)庫)之間,其作用是降低應用程序直接讀寫永久性數(shù)據(jù)存儲源的頻率,從而提高應用的運行性能。緩存中的數(shù)據(jù)是數(shù)據(jù)存儲源中數(shù)據(jù)的拷貝。緩存的物理介質通常是內存

hibernate中提供了兩個級別的緩存

第一級別的緩存是 Session 級別的緩存,它是屬于事務范圍的緩存。這一級別的緩存由 hibernate 管理的,一般情況下無需進行干預

第二級別的緩存是 SessionFactory 級別的緩存,它是屬于進程范圍的緩存

Hibernate 的緩存可以分為兩類:

內置緩存: Hibernate 自帶的, 不可卸載. 通常在 Hibernate 的初始化階段, Hibernate 會把映射元數(shù)據(jù)和預定義的 SQL 語句放到 SessionFactory 的緩存中, 映射元數(shù)據(jù)是映射文件中數(shù)據(jù)的復制, 而預定義 SQL 語句時 Hibernate 根據(jù)映射元數(shù)據(jù)推到出來的. 該內置緩存是只讀的.

外置緩存(二級緩存): 一個可配置的緩存插件. 在默認情況下, SessionFactory 不會啟用這個緩存插件. 外置緩存中的數(shù)據(jù)是數(shù)據(jù)庫數(shù)據(jù)的復制, 外置緩存的物理介質可以是內存或硬盤

二、理解二級緩存的并發(fā)訪問策略

三、配置進程范圍內的二級緩存(配置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配置

選擇需要使用二級緩存的持久化類, 設置它的二級緩存的并發(fā)訪問策略, <class> 元素的 cache 子元素表明 Hibernate 會緩存對象的簡單屬性, 但不會緩存集合屬性, 若希望緩存集合屬性中的元素, 必須在 <set> 元素中加入 <cache> 子元素

方法二  在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 
 // 將內存中的數(shù)據(jù)寫到硬盤 
 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方法會發(fā)送N+1條SQL查詢.但是會使用二級緩存的數(shù)據(jù) 
 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()方法會向二級緩存中放數(shù)據(jù),但是不會使用二級緩存中的數(shù)據(jù). 
 public void demo4(){ 
  Session session = HibernateUtils.getCurrentSession(); 
  Transaction tx = session.beginTransaction(); 
   
  // 查詢所有客戶: 
  // list方法會向二級緩存中放入數(shù)據(jù)的. 
  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);// 沒有發(fā)生SQL ,從二級緩存獲取的數(shù)據(jù). 
  // list()方法沒有使用二級緩存的數(shù)據(jù). 
  list = session.createQuery("from Customer").list(); 
  for (Customer customer : list) { 
   System.out.println(customer.getCname()); 
  } 
   
  tx.commit(); 
 } 
  
 @Test 
 // 二級緩存的集合緩沖區(qū)特點: 
 public void demo3(){ 
  Session session = HibernateUtils.getCurrentSession(); 
  Transaction tx = session.beginTransaction(); 
   
  Customer customer = (Customer) session.get(Customer.class, 1); 
  // 查詢客戶的訂單. 
  System.out.println("訂單的數(shù)量:"+customer.getOrders().size()); 
   
  tx.commit(); 
   
  session = HibernateUtils.getCurrentSession(); 
  tx = session.beginTransaction(); 
   
  Customer customer2 = (Customer) session.get(Customer.class, 1); 
  // 查詢客戶的訂單. 
  System.out.println("訂單的數(shù)量:"+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);// 發(fā)送SQL. 
   
  Customer customer2 = (Customer) session.get(Customer.class, 1);// 不發(fā)送SQL. 
   
  System.out.println(customer1 == customer2); 
   
  tx.commit(); 
   
  session = HibernateUtils.getCurrentSession(); 
  tx = session.beginTransaction(); 
   
  Customer customer3 = (Customer) session.get(Customer.class, 1);// 不發(fā)送SQL. 
  Customer customer4 = (Customer) session.get(Customer.class, 1);// 不發(fā)送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);// 發(fā)送SQL. 
   
  Customer customer2 = (Customer) session.get(Customer.class, 1);// 不發(fā)送SQL. 
   
   
   
  tx.commit(); 
   
  session = HibernateUtils.getCurrentSession(); 
  tx = session.beginTransaction(); 
   
  Customer customer3 = (Customer) session.get(Customer.class, 1);// 發(fā)送SQL. 
   
   
  tx.commit(); 
 } 
} 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Spring Security 安全認證的示例代碼

    Spring Security 安全認證的示例代碼

    這篇文章主要介紹了Spring Security 安全認證的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • 入門Java線程基礎一篇就夠了

    入門Java線程基礎一篇就夠了

    線程是進程中的一個實體,是被系統(tǒng)獨立調度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源
    2021-06-06
  • SSh結合Easyui實現(xiàn)Datagrid的分頁顯示

    SSh結合Easyui實現(xiàn)Datagrid的分頁顯示

    這篇文章主要為大家詳細介紹了SSh結合Easyui實現(xiàn)Datagrid的分頁顯示的相關資料,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Spring Boot項目添加外部Jar包以及配置多數(shù)據(jù)源的完整步驟

    Spring Boot項目添加外部Jar包以及配置多數(shù)據(jù)源的完整步驟

    這篇文章主要給大家介紹了關于Spring Boot項目添加外部Jar包以及配置多數(shù)據(jù)源的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-06-06
  • Mac安裝Maven的幾種方法小結

    Mac安裝Maven的幾種方法小結

    本文主要介紹了Mac安裝Maven的幾種方法小結,主要包括通過Homebrew安裝Maven,通過SDKMAN安裝Maven和通過官方網(wǎng)站下載安裝包安裝Maven,感興趣的可以了解一下
    2024-01-01
  • 詳解如何在Java8中創(chuàng)建和使用線程池

    詳解如何在Java8中創(chuàng)建和使用線程池

    在 Java 8 中,線程池(Thread Pool)是一種管理線程資源的機制,能夠有效地控制并發(fā)執(zhí)行的線程數(shù)量,減少線程創(chuàng)建和銷毀的開銷,提高系統(tǒng)的性能,本篇文章將詳細介紹如何在 Java 8 中創(chuàng)建和使用線程池,需要的朋友可以參考下
    2024-06-06
  • SpringBoot整合Minio的過程(支持公有及私有bucket)

    SpringBoot整合Minio的過程(支持公有及私有bucket)

    Bucket 是存儲Object的邏輯空間,每個Bucket之間的數(shù)據(jù)是相互隔離的,對用戶而言,相當于存放文件的頂層文件夾,這篇文章主要介紹了SpringBoot整合Minio的過程(支持公有及私有bucket),需要的朋友可以參考下
    2025-03-03
  • java swing中實現(xiàn)拖拽功能示例

    java swing中實現(xiàn)拖拽功能示例

    這篇文章主要介紹了java swing中實現(xiàn)拖拽功能示例,需要的朋友可以參考下
    2014-04-04
  • Java8時間接口LocalDateTime詳細用法

    Java8時間接口LocalDateTime詳細用法

    最近看別人項目源碼,發(fā)現(xiàn)Java8新的日期時間API很方便強大,所以整理了這篇文章,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Spring Boot Admin 動態(tài)修改日志級別的方法步驟

    Spring Boot Admin 動態(tài)修改日志級別的方法步驟

    這篇文章主要介紹了Spring Boot Admin 動態(tài)修改日志級別的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08

最新評論

灌阳县| 曲周县| 临颍县| 紫云| 玉山县| 启东市| 扬中市| 大石桥市| 通化市| 巩留县| 株洲县| 黎城县| 旬邑县| 吴江市| 白河县| 阿城市| 金川县| 武乡县| 株洲市| 拜城县| 台山市| 南和县| 临潭县| 固安县| 太湖县| 积石山| 凤山县| 绥化市| 临沭县| 邻水| 临泽县| 汉中市| 成安县| 汤原县| 开封市| 于田县| 宁德市| 上饶市| 泌阳县| 九龙城区| 平邑县|