自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Hibernate緩存機(jī)制探討

開(kāi)發(fā) 后端
緩存是對(duì)或計(jì)算代價(jià)較大的原始數(shù)據(jù)的復(fù)制存儲(chǔ)。通過(guò)Hibernate緩存機(jī)制,對(duì)緩存中的數(shù)據(jù)進(jìn)行訪問(wèn),可以縮短平均訪問(wèn)時(shí)間,提高數(shù)據(jù)的平均傳輸速度。

緩存是提高硬件和應(yīng)用程序性能的一個(gè)關(guān)鍵因素,在對(duì)象映射框架中更是如此。因此,合理使用Hibernate緩存機(jī)制能夠大幅度的提高Hibernate應(yīng)用程序的性能。

Hibernate提供了兩級(jí)緩存架構(gòu),第一級(jí)緩存是Session的緩存,第二級(jí)緩存是一個(gè)用戶決定是否使用的緩存,能夠借助與第三方的組件實(shí)現(xiàn)。Hibernate則提供了緩存管理接口,應(yīng)用程序可以自由的對(duì)Hibernate緩存機(jī)制進(jìn)行管理。

緩存是對(duì)或計(jì)算代價(jià)較大的原始數(shù)據(jù)的復(fù)制存儲(chǔ)。通過(guò)在緩存(連續(xù)的內(nèi)存空間)存儲(chǔ)數(shù)據(jù),對(duì)緩存中的數(shù)據(jù)進(jìn)行訪問(wèn),可以縮短平均訪問(wèn)時(shí)間,提高數(shù)據(jù)的平均傳輸速度。Hibernate緩存機(jī)制提供了這種高效傳輸?shù)氖侄巍?/P>

緩存首先出現(xiàn)在CPU中,由于CPU的速度很快,主存儲(chǔ)器的存儲(chǔ)速度無(wú)法與其相比,因而影響了計(jì)算機(jī)的執(zhí)行效率。在CPU和主存儲(chǔ)器之間加入了速度最快的SRAM作為CPU與相對(duì)低速的存儲(chǔ)器之間交換數(shù)據(jù)的緩沖區(qū),這樣可以大幅度提高系統(tǒng)的執(zhí)行效率,可且通過(guò)CACHE來(lái)事先讀取CPU可能需要的數(shù)據(jù)。推廣開(kāi)來(lái),凡是位于速度相差很大的兩種硬件或應(yīng)用之間的,用于協(xié)調(diào)兩者數(shù)據(jù)傳輸差異的結(jié)構(gòu)都可以稱為緩存。
緩存將最近訪問(wèn)過(guò)的信息存儲(chǔ)在特殊內(nèi)存系統(tǒng)中以避免CPU在重新到主存儲(chǔ)器中存取。在特定的硬件基礎(chǔ)和應(yīng)用架構(gòu)之上,緩存往往是提升系統(tǒng)性能的關(guān)鍵因素之一。在使用數(shù)據(jù)庫(kù)的應(yīng)用系統(tǒng)中,緩存位于數(shù)據(jù)庫(kù)和應(yīng)用之間,在內(nèi)存中保存底層數(shù)據(jù)庫(kù)的數(shù)據(jù)副本(應(yīng)用程序經(jīng)常方位的數(shù)據(jù)),以便應(yīng)用程序之間重內(nèi)存中存取而不必頻繁的方位數(shù)據(jù)庫(kù),因此提高了應(yīng)用程序訪問(wèn)數(shù)據(jù)的效率。

緩存介于應(yīng)用程序的數(shù)據(jù)訪問(wèn)層和數(shù)據(jù)庫(kù)等數(shù)據(jù)源層之間,一般位于內(nèi)存中,而數(shù)據(jù)庫(kù)等數(shù)據(jù)源長(zhǎng)來(lái)自硬盤(pán)或網(wǎng)絡(luò)。相對(duì)于硬盤(pán)和網(wǎng)絡(luò),應(yīng)用程序訪問(wèn)內(nèi)存的速度顯然要快的很多。不過(guò)如果緩存中數(shù)據(jù)量太大也可以放置到硬盤(pán)上,需要時(shí)在掉入內(nèi)存,這樣雖然速度慢些,但還是比直接從網(wǎng)絡(luò)獲取要快!

對(duì)于Hibernate而言,它是一個(gè)實(shí)現(xiàn)了對(duì)象關(guān)系映射的組件。應(yīng)用程序中的數(shù)據(jù)通過(guò)Hibernate緩存機(jī)制中的持久化實(shí)例反映。這些持久化實(shí)例維護(hù)的數(shù)據(jù)是來(lái)自于底層數(shù)據(jù)庫(kù)或即將同步更行到數(shù)據(jù)庫(kù)的數(shù)據(jù),為了獲取這些數(shù)據(jù),Hibernate必須頻繁的訪問(wèn)數(shù)據(jù)庫(kù),產(chǎn)生大量的數(shù)據(jù)庫(kù)連接操作和數(shù)據(jù)傳輸動(dòng)作,效率較低。另外,Hibernate屏蔽了底層數(shù)據(jù)庫(kù)的操作細(xì)節(jié),讓用戶可以以操作對(duì)象的方式訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù),在對(duì)象關(guān)系映射轉(zhuǎn)換的過(guò)程中,Hibernate勢(shì)必付出了一些系統(tǒng)開(kāi)銷!

為了提升Hibernate的數(shù)據(jù)庫(kù)訪問(wèn)效率并應(yīng)對(duì)Hibernate封裝底層數(shù)據(jù)庫(kù)的內(nèi)存開(kāi)銷,需要引入緩存策略。緩存作為數(shù)據(jù)庫(kù)數(shù)據(jù)在內(nèi)存中的臨時(shí)容器,內(nèi)涵了數(shù)據(jù)庫(kù)數(shù)在內(nèi)存中的臨時(shí)副本。Hibernate讀取所需數(shù)據(jù)時(shí),首先在緩存中查找(先是一級(jí)緩存再次是二級(jí)緩存),若果緩存中存在需要的數(shù)據(jù)則稱為命中(和CPU在一級(jí)緩存中取到需要的數(shù)據(jù)概念一樣),然后就會(huì)直接返回?cái)?shù)據(jù),這樣的話就避免了數(shù)據(jù)庫(kù)調(diào)用的開(kāi)銷,不過(guò)如果緩存中沒(méi)有所需要的數(shù)據(jù)還是會(huì)訪問(wèn)底層數(shù)據(jù)庫(kù)。

Hibernate采用二級(jí)緩存體系,包括Session緩存(一級(jí)緩存)和SessionFactory緩存(二級(jí)緩存)。

(1)Session緩存是內(nèi)置的,默認(rèn)的,不能被卸載。Session維護(hù)了其自身生命周期中的一些持久化實(shí)例和它們的集合。(就像是一個(gè)方法中的變量)

(2)SessionFactory緩存即Hibernate二級(jí)緩存,按結(jié)構(gòu)可以分為內(nèi)置緩存和外置緩存兩種。

針對(duì)緩存的生命周期的不同,我們可以將Hibernate的緩存分為三個(gè)層次:

1.事物級(jí)緩存

緩存只能被當(dāng)前事物訪問(wèn)。這個(gè)事物可以是一個(gè)數(shù)據(jù)庫(kù)事物(比如Session),也可以是某個(gè)應(yīng)用程序大的事物。緩存的聲明周期依賴于事物的生命周期,很顯然,就像是一個(gè)方法中的變量(內(nèi)部變量)方法執(zhí)行完后,其內(nèi)部變量就會(huì)小時(shí)除非我們?cè)谀莻€(gè)方法中將其存入一個(gè)全局變量的集合類中。因此,對(duì)于Session而言,事物級(jí)緩存有Session實(shí)現(xiàn)。Sessions內(nèi)部維護(hù)一個(gè)數(shù)據(jù)緩存這個(gè)緩存隨著Session的創(chuàng)建而建立,在Session關(guān)閉時(shí)將被JVM垃圾回收機(jī)制回收除非其還存在引用(即使把其放進(jìn)一個(gè)全局變量中例如集合)。在Hibernate緩存機(jī)制中,Session內(nèi)部緩存(說(shuō)白了也就是Session內(nèi)部變量)只能在Session實(shí)例范圍中使用。

2.應(yīng)用級(jí)緩存

緩存在某個(gè)應(yīng)用范圍被所有事務(wù)共享(指的是數(shù)據(jù)庫(kù)事務(wù)Session)。緩存的聲明周期依賴于應(yīng)用程序的生命周期,當(dāng)這個(gè)應(yīng)用程序的生命周期結(jié)束時(shí),緩存生命周球隨之結(jié)束(我們不妨理解為全局變量)。不過(guò)這里就存在一個(gè)問(wèn)題,由于緩存被所有事務(wù)共享,緩存可能被這些事務(wù)并發(fā)訪問(wèn),這個(gè)主要必須依靠對(duì)緩存設(shè)置必要的事務(wù)隔離機(jī)制和緩存共享策略來(lái)盡力避免。另外,應(yīng)用級(jí)緩存在整個(gè)應(yīng)用范圍內(nèi)使用,數(shù)據(jù)量較大時(shí)可以存儲(chǔ)在硬盤(pán)上。

對(duì)于Hibernate而言,應(yīng)用級(jí)別緩存有SessionFactory實(shí)現(xiàn)。Session實(shí)例有SessionFactory創(chuàng)建,并共享SessionFactory的緩存。

其實(shí)我們可以這樣理解Hibernate緩存機(jī)制中的SessionFactory與Session,以及一級(jí)緩存和二級(jí)緩存。SessionFactory是一個(gè)可執(zhí)行類的話,二級(jí)緩存就相當(dāng)于其內(nèi)部的一個(gè)集合類作為其全局變量,而Session則可以看做其內(nèi)部的一個(gè)方法(或者是內(nèi)部方法中的內(nèi)部類的實(shí)例),類的方法肯定是可以訪問(wèn)其類的變量(更何況全局變量),但是類的方法以結(jié)束其內(nèi)部類就會(huì)立即消失而類的全局變量則依然存在知道這個(gè)類執(zhí)行完所有方法。因此,如果我們想保存數(shù)據(jù)庫(kù)數(shù)據(jù)副本到二級(jí)緩存中,只能在這個(gè)類運(yùn)行內(nèi)部方法時(shí)把帶到的數(shù)據(jù)存到全局變量(比如集合類中)中。

 

【編輯推薦】

  1. Hibernate 刪除出現(xiàn)異常的解決方案
  2. Hibernate一對(duì)多關(guān)系的處理
  3. Struts與Hibernate的完美結(jié)合方案
  4. Hibernate單元測(cè)試的方法HSQLDB詳述
  5. 解析Hibernate的批量刪除功能
責(zé)任編輯:佚名 來(lái)源: JavaEye
相關(guān)推薦

2009-08-13 16:57:37

.NET緩存機(jī)制

2009-06-18 14:51:12

Hibernate緩存Hibernate

2010-03-01 17:57:11

WCF緩存機(jī)制

2009-06-29 08:48:41

Hibernate緩存

2009-09-23 17:03:08

Hibernate S

2009-09-25 10:25:54

Hibernate緩存

2012-02-03 11:31:33

HibernateJava

2009-09-25 13:51:13

Hibernate S

2009-06-30 14:08:00

Hibernate緩存

2009-09-22 10:50:04

Hibernate c

2009-09-22 11:24:07

Hibernate查詢

2009-09-23 16:30:01

Hibernate f

2009-09-22 09:31:15

Hibernate主鍵

2012-06-02 00:55:44

HibernateflushJava

2010-07-21 09:38:15

PHP緩存技術(shù)

2010-11-22 14:18:32

MySQL鎖機(jī)制

2009-09-27 14:53:38

Hibernate S

2009-06-17 15:13:30

2023-02-24 16:46:25

Glide緩存機(jī)制

2009-06-29 08:50:20

Hibernate主鍵
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)