hibernate緩存

回到頂部

1. 為什么要用 Hibernate 緩存?

? ?Hibernate是一個持久層框架,經常訪問物理數據庫。

? ?為了降低應用程序對物理數據源訪問的頻次,從而提高應用程序的運行性能。

? ?緩存內的數據是對物理數據源中的數據的復制,應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據。

回到頂部

2. 項目實戰

? ?當 Session 對象調用 save() 方法保存一個對象后,該對象會被放入到 Session 緩存中。

? ?當 Session 對象調用 get() 或 load() 方法從數據庫取出一個對象后,該對象也會被放入到 Session 緩存中。

? ?當使用同一個 Session 編寫 HQL 和 QBC 等從數據庫中查詢數據時,將直接從緩存中讀取數據,不會訪問數據庫。

? ?Hibernate 提供了幾個方法(evit/clear/contains/flush....)來管理和判斷一級緩存。

? ?現 JavaEE Dao 層中,提供給外部的數據庫訪問,每次都會從 Session 工廠中獲取新的 Session 線程?,導致一級緩存很少被利用。

? ?實例項目源碼:https://git.oschina.net/LanboEx/hiberdemo

復制代碼
        //1.Hibernate 自身的一級緩存,可以查看到只輸出了一條 sqlSession session = getSession();UserPO userPO = session.get(UserPO.class, "031e7a36972e11e6acede16e8241c0fe");System.out.println("1. 第一次訪問 DB:" + userPO.getName() + "," + userPO.getPasswd());UserPO userPO1 = session.get(UserPO.class, "031e7a36972e11e6acede16e8241c0fe");System.out.println("2. 第二次訪問 DB:" + userPO1.getName() + ",一級緩存中是否存在特定對象" + session.contains(userPO));
復制代碼

復制代碼
       //2.使用 evite/clear 方法手動清除緩存中特定對象,可以看到 hiber 輸出了兩條 SQLSession session1 = getSession();UserPO userPO3 = session1.get(UserPO.class, "031e7a36972e11e6acede16e8241c0fe");System.out.println("3. 第一次獲取對象:" + userPO3.getName() + "," + userPO3.getPasswd());session1.evict(userPO3);UserPO userPO4 = session1.get(UserPO.class, "031e7a36972e11e6acede16e8241c0fe");System.out.println("4. 第二次獲取對象:" + userPO4.getName() + "," + userPO4.getPasswd());
復制代碼

回到頂部

3. Hibernate 緩存原理

? ?Hibernate 緩存包括兩大類:

a.Hibernate 一級緩存,又稱為[Session的緩存]。

? ?Session 內置不能被卸載,Session 的緩存是事務范圍的緩存(Session 對象的生命周期通常對應一個數據庫事務或者一個應用事務)。

? ?一級緩存中,持久化類的每個實例都具有唯一的 OID。

b.Hibernate 二級緩存,又稱為[SessionFactory的緩存]。

? ?由于 SessionFactory 對象的生命周期和應用程序的整個過程對應。

? ?Hibernate二級緩存是進程范圍或者集群范圍的緩存,有可能出現并發問題,需要采用適當的并發訪問策略,該策略為被緩存的數據提供了事務隔離級別。

? ?第二級緩存是可選的,是一個可配置的插件,默認下 SessionFactory 不會啟用這個插件。

? ?Hibernate 提供了 org.hibernate.cache.CacheProvider 接口,它充當緩存插件與 Hibernate 之間的適配器。

? ?什么樣的數據適合存放到第二級緩存中?

? ?1) 很少被修改的數據

? ?2) 不是很重要的數據,允許出現偶爾并發的數據

? ?3) 不會被并發訪問的數據

? ?4) 常量數據

不適合存放到第二級緩存的數據?

? 1) 經常被修改的數據

? 2) 絕對不允許出現并發訪問的數據,如財務數據,絕對不允許出現并發?

? 3) 與其他應用共享的數據。

c.Session 的延遲加載實現要解決兩個問題:正常關閉連接和確保請求中訪問的是同一個 Session。

? ?Hibernate Session 就是 java.sql.Connection 的一層高級封裝,一個 Session 對應了一個 Connection。

? ?Http 請求結束后正確的關閉 Session(過濾器實現了Session的正常關閉);

? ?延遲加載必須保證是同一個 Session( Session 綁定在 ThreadLocal)。

d.Hibernate 查找對象如何應用緩存?

? ?當 Hibernate 根據 ID 訪問數據對象的時候,首先從 Session 一級緩存中查;

? ?查不到,如果配置了二級緩存,那么從二級緩存中查;

? ?如果都查不到,再查詢數據庫,把結果按照 ID 放入到緩存刪除、更新、增加數據的時候,同時更新緩存。

e.一級緩存與二級緩存的對比圖

?

一級緩存

二級緩存

存放數據的形式

相互關聯的持久化對象

對象的散裝數據

緩存的范圍

事務范圍,每個事務都擁有單獨的一級緩存

進程范圍或集群范圍,緩存被同一個進程或集群范圍內所有事務共享

并發訪問策略

由于每個事務都擁有單獨的一級緩存不會出現并發問題,因此無須提供并發訪問策略

由于多個事務會同時訪問二級緩存中的相同數據,因此必須提供適當的并發訪問策略,來保證特定的事務隔離級別

數據過期策略

處于一級緩存中的對象永遠不會過期,除非應用程序顯示清空或者清空特定對象

必須提供數據過期策略,如基于內存的緩存中對象的最大數目,允許對象處于緩存中的最長時間,以及允許對象處于緩存中的最長空閑時間

物理介質

內存

內存和硬盤,對象的散裝數據首先存放到基于內存的緩存中,當內存中對象的數目達到數據過期策略的maxElementsInMemory值,就會把其余的對象寫入基于硬盤的緩存中

緩存軟件實現

在Hibernate的Session的實現中包含

由第三方提供,Hibernate僅提供了緩存適配器,用于把特定的緩存插件集成到Hibernate中

啟用緩存的方式

只要通過Session接口來執行保存,更新,刪除,加載,查詢,Hibernate就會啟用一級緩存,對于批量操作,如不希望啟用一級緩存,直接通過JDBCAPI來執行

用戶可以再單個類或類的單個集合的粒度上配置第二級緩存,如果類的實例被經常讀,但很少被修改,就可以考慮使用二級緩存,只有為某個類或集合配置了二級緩存,Hibernate在運行時才會把它的實例加入到二級緩存中

用戶管理緩存的方式

一級緩存的物理介質為內存,由于內存的容量有限,必須通過恰當的檢索策略和檢索方式來限制加載對象的數目,Session的evit()方法可以顯示的清空緩存中特定對象,但不推薦

二級緩存的物理介質可以使內存和硬盤,因此第二級緩存可以存放大容量的數據,數據過期策略的maxElementsInMemory屬性可以控制內存中的對象數目,管理二級緩存主要包括兩個方面:選擇需要使用第二級緩存的持久化類,設置合適的并發訪問策略;選擇緩存適配器,設置合適的數據過期策略。SessionFactory的evit()方法也可以顯示的清空緩存中特定對象,但不推薦

轉載于:https://www.cnblogs.com/LvLoveYuForever/p/7117137.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392208.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392208.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392208.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle 連接greenplum,Oracle通過DBLINK訪問GreenPlum

為多個數據庫之間的整合和遷移做POC,嘗試使用Oracle Gateway和Heterogeneous Service來中轉訪問,測試過好多次,最終發現只有在32位的Oracle當中才能成功配置。 配置環境如下: Windows 2003 32bit 或 Windows 2008 64bit Oracle10G…

如何使用React和Redux前端創建Rails項目

by Mark Hopson馬克霍普森(Mark Hopson) 如何使用React和Redux前端(加上Typescript!)創建Rails項目 (How to create a Rails project with a React and Redux front-end (plus Typescript!)) 在Rails項目中使用React和Redux設置單頁Javascript App的完整指南。 (A …

分布與并行計算—用任務管理器畫CPU正弦曲線(Java)

class drawSin implements Runnable{Overridepublic void run() {final double SPLIT 0.01;// 角度的分割final int COUNT (int) (2 / SPLIT);// 2PI分割的次數,也就是2/0.01個,正好是一周final double PI Math.PI;final int interval 100;// 時間間…

Rails文件上傳file_field報錯Encoding::UndefinedConversionError

服務器用的是ubuntu12 64bit,環境是ruby1.9.3rails3mysql,測試是在windows2003上。 上傳一個【.gitconfig】文件,沒有問題,上傳【新浪微博數據挖掘.pdf】報錯,上傳【back.jpg】報錯。 下面是兩段信息,是從【…

好久不來這里寫東西了.

我正準備離開學校去實現自己的目標,很清楚自己在學校的... ...做共享程序員,就不得不考慮些商業上的東西,自己要吃飯啊!我想我是該好好的處理一下這二者的關系. 轉載于:https://www.cnblogs.com/wangxiang/archive/2007/01/01/609714.html

Asp.net mvc中使用配置Unity

第一步:添加unity.mvc 第二步:在添加之后會在app_start中生成UnityConfig.cs,UnityMvcActivator.cs 第三步:使用 第四步:效果展示 轉載于:https://www.cnblogs.com/WJ--NET/p/7117839.html

頂級數據恢復_頂級R數據科學圖書館

頂級數據恢復Data science is the discipline of making data useful數據科學是使數據有用的學科 When we talk about the top programming language for Data Science, we often find Python to be the best fit for the topic. Sure, Python is undoubtedly an excellent cho…

xp系統oracle數據庫,Oracle10g 數據庫的安裝基于windowsXP

Oracle的安裝一、首先去官網下載自身系統相對應的數據庫軟件http://www.oracle.com/cn/index.htmlOracle軟件本身是免費的,個人用途完全沒關系,商業用途并被發現才會被Oracle所要求收費,收費買的不是軟件,而是授權。何謂授權&…

了解React Native中的不同JavaScript環境

by Khoa Pham通過Khoa Pham 了解React Native中的不同JavaScript環境 (Get to know different JavaScript environments in React Native) React Native can be very easy to get started with, and then at some point problems occur and we need to dive deep into it.Reac…

分布與并行計算—生命游戲(Java)

生命游戲其實是一個零玩家游戲,它包括一個二維矩形世界,這個世界中的每個方格居住著一個活著的或死了的細胞。一個細胞在下一個時刻生死取決于相鄰八個方格中活著的或死了的細胞的數量。如果相鄰方格活著的細胞數量過多,這個細胞會因為資源匱…

正確認識 Vista 激活期限

當我們在安裝 Vista 時,可以不輸入序列號進行安裝,這和以往的操作系統安裝有所不同,我們不必再為安裝系統時找不到我們的序列號標簽而發愁。如果不輸入序列號而繼續安裝系統,那么系統將提示我們有30天的激活期限!這里的…

Oracle使用hs odbc連接mssql2008

1.創建odbc 2.在 product\11.2.0\dbhome_1\hs\admin\ 下拷貝initdg4odbc,把名字改為initcrmsql(init所建odbc的名稱) HS_FDS_CONNECT_INFO crmsql #odbc名稱 HS_FDS_TRACE_LEVEL 0 HS_FDS_RECOVERY_ACCOUNTsa #要連接的數據庫名稱 HS_FDS_RECOVERY_PWD…

oracle修改物化視圖字段,獲取物化視圖字段的修改矢量(一)

當表建立了物化視圖日志之后,表的DML修改會被記錄到物化視圖日志中,而物化視圖日志則包含了一個修改矢量,來記錄哪個列被修改。在文章列的修改矢量可以通過2的N次方來獲得,也就是POWER(2, N)。而N的值,就是列的位置。但…

聚合 數據處理_R中聚合的簡介:強大的數據處理工具

聚合 數據處理by Satyam Singh Chauhan薩蒂揚辛格喬漢(Satyam Singh Chauhan) R中聚合的簡介:強大的數據處理工具 (An introduction to aggregates in R: a powerful tool for playing with data) Data Visualization is not just about colors and graphs. It’s …

大數據 notebook_Dockerless Notebook:數據科學期待已久的未來

大數據 notebookData science is hard. Data scientists spend hours figuring out how to install that Python package on their laptops. Data scientists read many pages of Google search results to connect to that database. Data scientists write a detailed docume…

【NGN學習筆記】6 代理(Proxy)和背靠背用戶代理(B2BUA)

1. 什么是Proxy模式? 按照RFC3261中的定義,Proxy服務器是一個中間的實體,它本身即作為客戶端也作為服務端,為其他客戶端提供請求的轉發服務。一個Proxy服務器首先提供的是路由服務,也就是說保證請求被發到更加”靠近”…

分布與并行計算—并行計算π(Java)

并行計算π public class pithread extends Thread {private static long mini1000000000;private long start,diff;double sum0;double cur1/(double)mini;public pithread(long start,long diff) {this.startstart;this.diffdiff;}Overridepublic void run() {long istart;f…

linux復制文件跳過相同,Linux cp指令,怎么跳過相同的文件

1、使用cp命令的-n參數即可跳過相同的文件 。2、cp命令使用詳解:1)、用法:cp [選項]... [-T] 源文件 目標文件或:cp [選項]... 源文件... 目錄或:cp [選項]... -t 目錄 源文件...將源文件復制至目標文件,或將多個源文件…

eclipse類自動生成注釋

1.創建新類時自動生成注釋 window->preference->java->code styple->code template 當你選擇到這部的時候就會看見右側有一個框顯示出code這個選項,你點開這個選項,點一下他下面的New …

rman恢復

--建表create table sales( product_id number(10), sales_date date, sales_cost number(10,2), status varchar2(20));--插數據insert into sales values (1,sysdate-90,18.23,inactive);commit; --啟用rman做全庫備份 運行D:\autobackup\rman\backup_orcl.bat 生成…