主題:   最近在看Hibernate的緩存,有一點(diǎn)沒(méi)搞清楚

精華帖 (0) :: 良好帖 (0) :: 入門(mén)帖 (13) :: 隱藏帖 (0) 
作者 正文
ellie4c
等級(jí): 初級(jí)會(huì)員
ellie4c的博客:ellie4c

文章: 20
積分: 27
圈子: Tapestry

       時(shí)間: 2007-06-01 15:18    關(guān)鍵字:   Hibernate           

我想問(wèn)一下,hibernate在事務(wù)提交后一級(jí)緩存的實(shí)例是如何和二級(jí)緩存同步的?用到那些機(jī)制哪?










聲明:JavaEye文章版權(quán)屬于作者,受法律保護(hù)。沒(méi)有作者書(shū)面許可不得轉(zhuǎn)載。若作者同意轉(zhuǎn)載,必須以超鏈接形式標(biāo)明文章原始出處和作者。

相關(guān)文章:   對(duì)robbin所說(shuō)Hibernate缺陷的一些不理解   Hibernate中如何通過(guò)父節(jié)點(diǎn)查詢所有子節(jié)點(diǎn)?

推薦鏈接:   免費(fèi)下載IBM社區(qū)版軟件,體驗(yàn)高效開(kāi)發(fā).   京滬穗蓉四地免費(fèi)注冊(cè),SOA技術(shù)高手匯聚交鋒.
返回頂端  1樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 15:18  
alex22222
等級(jí): 初級(jí)會(huì)員
alex22222的博客:alex22222

文章: 3
積分: 4

       時(shí)間: 2007-06-01 15:20    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

這個(gè)問(wèn)題我也想搞清楚

返回頂端  2樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 15:20   我來(lái)評(píng)分:  請(qǐng)先 登錄
ahuaxuan
等級(jí): 2鉆會(huì)員
ahuaxuan的博客:ahuaxuan

性別:
文章: 499
積分: 1156
來(lái)自: 上海
圈子: JBPM @net

       時(shí)間: 2007-06-01 15:34    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

事務(wù)提交后,一級(jí)緩存中的數(shù)據(jù)會(huì)被更新到數(shù)據(jù)庫(kù),如果二級(jí)緩存設(shè)置為讀寫(xiě),那么這份數(shù)據(jù)會(huì)同時(shí)更新到二級(jí)緩存。
你問(wèn)的問(wèn)題相當(dāng)于:事務(wù)提交后一級(jí)緩存中的數(shù)據(jù)怎么同步到數(shù)據(jù)庫(kù)。

返回頂端  3樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 15:34  
我來(lái)評(píng)分:  請(qǐng)先 登錄
ellie4c
等級(jí): 初級(jí)會(huì)員
ellie4c的博客:ellie4c

文章: 20
積分: 27
圈子: Tapestry

       時(shí)間: 2007-06-01 15:41    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

不是的 一級(jí)緩存的數(shù)據(jù),其實(shí)在h執(zhí)行相關(guān)的save,insert的時(shí)候已經(jīng)提交到數(shù)據(jù)庫(kù)的臟數(shù)據(jù)里面了。
我想問(wèn)的是一級(jí)緩存是利用什么機(jī)制 來(lái)同步二級(jí)緩存的,有誰(shuí)知道嗎?

返回頂端  4樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 15:41  
我來(lái)評(píng)分:  請(qǐng)先 登錄
拋出異常的愛(ài)
等級(jí): 5鉆會(huì)員
拋出異常的愛(ài)的博客:天使不喜歡看代碼

文章: 5237
積分: 2512
來(lái)自: 北京
圈子: 盤(pán)古黨

       時(shí)間: 2007-06-01 15:45    評(píng)級(jí):   11111 (1位會(huì)員評(píng)分)          

查詢。
臟了丟掉/

返回頂端  5樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 21:15  
我來(lái)評(píng)分:  請(qǐng)先 登錄
ahuaxuan
等級(jí): 2鉆會(huì)員
ahuaxuan的博客:ahuaxuan

性別:
文章: 499
積分: 1156
來(lái)自: 上海
圈子: JBPM @net

       時(shí)間: 2007-06-01 15:51    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

ellie4c 寫(xiě)道
不是的 一級(jí)緩存的數(shù)據(jù),其實(shí)在h執(zhí)行相關(guān)的save,insert的時(shí)候已經(jīng)提交到數(shù)據(jù)庫(kù)的臟數(shù)據(jù)里面了。
我想問(wèn)的是一級(jí)緩存是利用什么機(jī)制 來(lái)同步二級(jí)緩存的,有誰(shuí)知道嗎?

你說(shuō)hibernate在執(zhí)行save操作時(shí)會(huì)提交數(shù)據(jù)到數(shù)據(jù)庫(kù),你在哪里看到的結(jié)論,你用的是什么數(shù)據(jù)庫(kù),支持事務(wù)嗎,你不會(huì)用的mysql的myisam吧
返回頂端  6樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 15:51  
我來(lái)評(píng)分:  請(qǐng)先 登錄
ellie4c
等級(jí): 初級(jí)會(huì)員
ellie4c的博客:ellie4c

文章: 20
積分: 27
圈子: Tapestry

       時(shí)間: 2007-06-01 15:54    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

你的意思是不是指 拿一級(jí)緩存的PO去查數(shù)據(jù)庫(kù),如果返回對(duì)象的話則 更新數(shù)據(jù)庫(kù),如果沒(méi)返回則 通知二級(jí)緩存 丟掉數(shù)據(jù)?是不是這樣的?hibernate也是這樣的馬?

返回頂端  7樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 15:54  
我來(lái)評(píng)分:  請(qǐng)先 登錄
ellie4c
等級(jí): 初級(jí)會(huì)員
ellie4c的博客:ellie4c

文章: 20
積分: 27
圈子: Tapestry

       時(shí)間: 2007-06-01 15:54    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

你的意思是不是指 拿一級(jí)緩存的PO去查數(shù)據(jù)庫(kù),如果返回對(duì)象的話則 更新二級(jí)緩存,如果沒(méi)返回則 通知二級(jí)緩存 丟掉數(shù)據(jù)?是不是這樣的?hibernate也是這樣的馬?

返回頂端  8樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 15:54  
我來(lái)評(píng)分:  請(qǐng)先 登錄
ellie4c
等級(jí): 初級(jí)會(huì)員
ellie4c的博客:ellie4c

文章: 20
積分: 27
圈子: Tapestry

       時(shí)間: 2007-06-01 15:59    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

ahuaxuan 寫(xiě)道
ellie4c 寫(xiě)道
你說(shuō)hibernate在執(zhí)行save操作時(shí)會(huì)提交數(shù)據(jù)到數(shù)據(jù)庫(kù),你在哪里看到的結(jié)論,你用的是什么數(shù)據(jù)庫(kù),支持事務(wù)嗎,你不會(huì)用的mysql的myisam吧

這里的提交是臟提交,是提交到事務(wù)本身的數(shù)據(jù)空間里面,真正的提交是在執(zhí)行tx.commit

返回頂端  9樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 15:59  
我來(lái)評(píng)分:  請(qǐng)先 登錄
ahuaxuan
等級(jí): 2鉆會(huì)員
ahuaxuan的博客:ahuaxuan

性別:
文章: 499
積分: 1156
來(lái)自: 上海
圈子: JBPM @net

       時(shí)間: 2007-06-01 16:00    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

ellie4c 寫(xiě)道
你的意思是不是指 拿一級(jí)緩存的PO去查數(shù)據(jù)庫(kù),如果返回對(duì)象的話則 更新二級(jí)緩存,如果沒(méi)返回則 通知二級(jí)緩存 丟掉數(shù)據(jù)?是不是這樣的?hibernate也是這樣的馬?

第一,如果你的數(shù)據(jù)庫(kù)支持事務(wù),而且默認(rèn)隔離級(jí)別是讀寫(xiě)已提交的話(大部分?jǐn)?shù)據(jù)庫(kù)是這樣),是不會(huì)出現(xiàn)什么臟數(shù)據(jù)的。可以仔細(xì)閱讀一下事務(wù)和隔離級(jí)別,和不同隔離級(jí)別所能解決的情況。讀寫(xiě)已提交就是解決臟讀問(wèn)題的
第二,一級(jí)緩存中存放的就是持久對(duì)象,那為什么要查數(shù)據(jù)庫(kù)呢,看來(lái)你對(duì)hibernate管理的對(duì)象的3種狀態(tài)理解不深刻,持久狀態(tài)的對(duì)象就代表數(shù)據(jù)庫(kù)中的記錄




主題:   最近在看Hibernate的緩存,有一點(diǎn)沒(méi)搞清楚

精華帖 (0) :: 良好帖 (0) :: 入門(mén)帖 (13) :: 隱藏帖 (0) 
作者 正文
ellie4c
等級(jí): 初級(jí)會(huì)員
ellie4c的博客:ellie4c

文章: 20
積分: 27
圈子: Tapestry

       時(shí)間: 2007-06-01 16:12    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

[quote="ahuaxuan第一,如果你的數(shù)據(jù)庫(kù)支持事務(wù),而且默認(rèn)隔離級(jí)別是讀寫(xiě)已提交的話(大部分?jǐn)?shù)據(jù)庫(kù)是這樣),是不會(huì)出現(xiàn)什么臟數(shù)據(jù)的。可以仔細(xì)閱讀一下事務(wù)和隔離級(jí)別,和不同隔離級(jí)別所能解決的情況。讀寫(xiě)已提交就是解決臟讀問(wèn)題的

這個(gè)我很清楚地,你大概沒(méi)搞清楚我的問(wèn)題,這個(gè)算了,
我想問(wèn)你,事務(wù)里面的一二級(jí)緩存是怎么實(shí)現(xiàn)同步的,比如事務(wù)里面更新了一個(gè)對(duì)象,h什么時(shí)候通知二級(jí)緩存同步對(duì)象的狀態(tài),以及h是怎么知道什么時(shí)候更新二級(jí)緩存,什么時(shí)候從二級(jí)里面刪除數(shù)據(jù)

返回頂端  11樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 16:12  
我來(lái)評(píng)分:  請(qǐng)先 登錄
ahuaxuan
等級(jí): 2鉆會(huì)員
ahuaxuan的博客:ahuaxuan

性別:
文章: 499
積分: 1156
來(lái)自: 上海
圈子: JBPM @net

       時(shí)間: 2007-06-01 16:22    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

ellie4c 寫(xiě)道

這個(gè)我很清楚地,你大概沒(méi)搞清楚我的問(wèn)題,這個(gè)算了,
我想問(wèn)你,事務(wù)里面的一二級(jí)緩存是怎么實(shí)現(xiàn)同步的,比如事務(wù)里面更新了一個(gè)對(duì)象,h什么時(shí)候通知二級(jí)緩存同步對(duì)象的狀態(tài),以及h是怎么知道什么時(shí)候更新二級(jí)緩存,什么時(shí)候從二級(jí)里面刪除數(shù)據(jù)

1,之前你說(shuō)的有一個(gè)臟提交的概念,這個(gè)我不知道你是什么意思,你是指發(fā)送sql語(yǔ)句給數(shù)據(jù)庫(kù)嗎。
但是調(diào)用save方法并不會(huì)發(fā)送sql語(yǔ)句到db,除非你再調(diào)用flush方法。

2,我說(shuō)了:什么時(shí)候把數(shù)據(jù)同步到數(shù)據(jù)庫(kù),什么時(shí)候就把數(shù)據(jù)同步到二級(jí)緩存。

返回頂端  12樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 16:23  
我來(lái)評(píng)分:  請(qǐng)先 登錄
ellie4c
等級(jí): 初級(jí)會(huì)員
ellie4c的博客:ellie4c

文章: 20
積分: 27
圈子: Tapestry

       時(shí)間: 2007-06-01 16:27    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

ahuaxuan 寫(xiě)道
ellie4c 寫(xiě)道

這個(gè)我很清楚地,你大概沒(méi)搞清楚我的問(wèn)題,這個(gè)算了,
我想問(wèn)你,事務(wù)里面的一二級(jí)緩存是怎么實(shí)現(xiàn)同步的,比如事務(wù)里面更新了一個(gè)對(duì)象,h什么時(shí)候通知二級(jí)緩存同步對(duì)象的狀態(tài),以及h是怎么知道什么時(shí)候更新二級(jí)緩存,什么時(shí)候從二級(jí)里面刪除數(shù)據(jù)

1,之前你說(shuō)的有一個(gè)臟提交的概念,這個(gè)我不知道你是什么意思,你是指發(fā)送sql語(yǔ)句給數(shù)據(jù)庫(kù)嗎。
但是調(diào)用save方法并不會(huì)發(fā)送sql語(yǔ)句到db,除非你再調(diào)用flush方法。

2,我說(shuō)了:什么時(shí)候把數(shù)據(jù)同步到數(shù)據(jù)庫(kù),什么時(shí)候就把數(shù)據(jù)同步到二級(jí)緩存。

怎么同步法?我想知道的是算法,一級(jí)緩存里面有一堆對(duì)象,怎么通知二級(jí)緩存取去執(zhí)行更新或刪除?
返回頂端  13樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 16:27  
我來(lái)評(píng)分:  請(qǐng)先 登錄
ellie4c
等級(jí): 初級(jí)會(huì)員
ellie4c的博客:ellie4c

文章: 20
積分: 27
圈子: Tapestry

       時(shí)間: 2007-06-01 16:29    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

ellie4c 寫(xiě)道
ahuaxuan 寫(xiě)道
ellie4c 寫(xiě)道

這個(gè)我很清楚地,你大概沒(méi)搞清楚我的問(wèn)題,這個(gè)算了,
我想問(wèn)你,事務(wù)里面的一二級(jí)緩存是怎么實(shí)現(xiàn)同步的,比如事務(wù)里面更新了一個(gè)對(duì)象,h什么時(shí)候通知二級(jí)緩存同步對(duì)象的狀態(tài),以及h是怎么知道什么時(shí)候更新二級(jí)緩存,什么時(shí)候從二級(jí)里面刪除數(shù)據(jù)

1,之前你說(shuō)的有一個(gè)臟提交的概念,這個(gè)我不知道你是什么意思,你是指發(fā)送sql語(yǔ)句給數(shù)據(jù)庫(kù)嗎。
但是調(diào)用save方法并不會(huì)發(fā)送sql語(yǔ)句到db,除非你再調(diào)用flush方法。

2,我說(shuō)了:什么時(shí)候把數(shù)據(jù)同步到數(shù)據(jù)庫(kù),什么時(shí)候就把數(shù)據(jù)同步到二級(jí)緩存。

怎么同步法?我想知道的是算法,一級(jí)緩存里面有一堆對(duì)象,怎么通知二級(jí)緩存取去執(zhí)行更新或刪除?
講的詳細(xì)點(diǎn)就是 怎么讓二級(jí)緩存知道,一級(jí)緩存里面的這個(gè)對(duì)象我應(yīng)該更新,那個(gè)對(duì)象我應(yīng)該刪除?
返回頂端  14樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 16:30  
我來(lái)評(píng)分:  請(qǐng)先 登錄
ahuaxuan
等級(jí): 2鉆會(huì)員
ahuaxuan的博客:ahuaxuan

性別:
文章: 499
積分: 1156
來(lái)自: 上海
圈子: JBPM @net

       時(shí)間: 2007-06-01 16:41    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

我 的理解是在事務(wù)提交的時(shí)候,首先在二級(jí)緩存中根據(jù)id找到對(duì)應(yīng)的數(shù)據(jù),然后通過(guò)session中的指令來(lái)判斷是更新這個(gè)數(shù)據(jù)還是刪除這個(gè)數(shù)據(jù),通過(guò)這樣的 方法,同步了二級(jí)緩存之后,再向db發(fā)送sql語(yǔ)句,隨后向db發(fā)送事務(wù)提交指令,但我沒(méi)有看過(guò)源代碼,應(yīng)該是類似這樣的

也有可能是在事務(wù)提交之后更新二級(jí)緩存,這樣也許更合理,因?yàn)槿绻聞?wù)回滾,二級(jí)緩存就根本都不會(huì)涉及到了

返回頂端  15樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 16:51  
我來(lái)評(píng)分:  請(qǐng)先 登錄
ellie4c
等級(jí): 初級(jí)會(huì)員
ellie4c的博客:ellie4c

文章: 20
積分: 27
圈子: Tapestry

       時(shí)間: 2007-06-01 16:51    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

這樣的話 如果一個(gè)對(duì)象有多個(gè)操作指令的話 比如insert(a),update(a),delete(a)全部在一個(gè)事務(wù)里面的話,這樣同步起來(lái)代價(jià)就太大了,不知道其他看過(guò)代碼的人 有沒(méi)有什么想法

返回頂端  16樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 16:51  
我來(lái)評(píng)分:  請(qǐng)先 登錄
ahuaxuan
等級(jí): 2鉆會(huì)員
ahuaxuan的博客:ahuaxuan

性別:
文章: 499
積分: 1156
來(lái)自: 上海
圈子: JBPM @net

       時(shí)間: 2007-06-01 16:53    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

ellie4c 寫(xiě)道
這樣的話 如果一個(gè)對(duì)象有多個(gè)操作指令的話 比如insert(a),update(a),delete(a)全部在一個(gè)事務(wù)里面的話,這樣同步起來(lái)代價(jià)就太大了,不知道其他看過(guò)代碼的人 有沒(méi)有什么想法

第一你要考慮到實(shí)際開(kāi)發(fā)中有沒(méi)有這種問(wèn)題,第二,save之后的update只不過(guò)是操作一級(jí)緩存,沒(méi)有同步的問(wèn)題,delete也是如此,怎么會(huì)有同步的問(wèn)題???
返回頂端  17樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 16:53  
我來(lái)評(píng)分:  請(qǐng)先 登錄
ellie4c
等級(jí): 初級(jí)會(huì)員
ellie4c的博客:ellie4c

文章: 20
積分: 27
圈子: Tapestry

       時(shí)間: 2007-06-01 16:58    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

這是算法里面應(yīng)該考慮的一種情況,我們不要偏離主題,你上面的根據(jù)指令來(lái)判斷 應(yīng)該會(huì)有這種情況,我想聽(tīng)聽(tīng)有沒(méi)有那位高手看懂過(guò)里面的算法實(shí)現(xiàn)?我一向覺(jué)得不能只會(huì)用。

返回頂端  18樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-01 16:58  
我來(lái)評(píng)分:  請(qǐng)先 登錄
huangyiiiiii
等級(jí): 初級(jí)會(huì)員
huangyiiiiii的博客:codeplayer

性別:
文章: 84
積分: 80
圈子: Python

       時(shí)間: 2007-06-03 01:31    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

hibernate 沒(méi)用過(guò),不過(guò)根據(jù)我用另一個(gè)python下的類似hibernate的ORM的經(jīng)驗(yàn),你們所謂的一級(jí)二級(jí)緩存應(yīng)該是這樣的吧:

代碼
  1. session = create_session()  
  2. user = User(name='hello',...) # 這個(gè)是所謂的二級(jí)緩存?  
  3. session.save(user) # 這里還沒(méi)有實(shí)際操作數(shù)據(jù)庫(kù) 莫非就是你們所謂的更新了一級(jí)緩存?  
  4. session.flush() # 這里修改了數(shù)據(jù)庫(kù)了  

不過(guò)在我看來(lái)這里并沒(méi)有兩級(jí)緩存,user.save() 時(shí)只是讓 ORM 記錄下來(lái)有一個(gè) user 需要 save 了。包括屬性的修改也是如此,當(dāng)修改一個(gè)屬性的值時(shí),ORM 會(huì)先記下這個(gè)需要更新的對(duì)象。
也就是說(shuō)在 user.save() 后,session.flush() 前查詢 user 表,應(yīng)該是得不到剛創(chuàng)建的這個(gè) user 對(duì)象的。
ORM 在最后 session.flush() 時(shí)要干比較多的事情,根據(jù)所記錄下的對(duì)象的保存修改刪除等變化,并通過(guò)分析各個(gè)表之間的外鍵關(guān)聯(lián)等,得出一個(gè)合適的 SQL 實(shí)際執(zhí)行的順序,這里用到的算法叫做 topological sort。
另外 SQLAlchemy 里還有個(gè)像是緩存的東西:Identity Map(簡(jiǎn)單搜了一下,這個(gè)概念應(yīng)該是來(lái)自 Hibernate 的),莫非這就是你們所說(shuō)的一級(jí)緩存?不過(guò)我覺(jué)得這東西就作用來(lái)看應(yīng)該不能算是緩存,只是用來(lái)保持?jǐn)?shù)據(jù)一致性的。
返回頂端  19樓
瀏覽發(fā)表者的主頁(yè) 閱讀會(huì)員資料 發(fā)送站內(nèi)短信   最后更新:2007-06-03 01:31  
我來(lái)評(píng)分:  請(qǐng)先 登錄
ellie4c
等級(jí): 初級(jí)會(huì)員
ellie4c的博客:ellie4c

文章: 20
積分: 27
圈子: Tapestry

       時(shí)間: 2007-06-03 10:26    評(píng)級(jí):   11111 (0位會(huì)員評(píng)分)          

我最近在看它的源碼,沒(méi)什么用,不過(guò)我覺(jué)得這樣的算法大家覺(jué)得行不行,就是orm框架 每次都記錄一級(jí)緩存里面對(duì)象的最后的操作狀態(tài),不管它前面執(zhí)行過(guò)么操作,在最后提交以后遍歷整個(gè)一級(jí)緩存的map同步。
如果事
insert:新增到二級(jí)緩存
update:新增或更新到二級(jí)緩存
delete:查找二級(jí)緩存找到就刪除
select:不做操作,
但是select操作會(huì)發(fā)生一種例外就是先insert/update再select所以
select操作只是從二級(jí)緩存到一級(jí)緩存或者DB到一級(jí)的時(shí)候記錄select操作,如果這個(gè)對(duì)象再一級(jí)緩存里面已經(jīng)存在,就算他再次被查找到也不去更新他的select操作。這樣的算法大家看看有沒(méi)有什么問(wèn)題,還有其他的好點(diǎn)的算法嗎?



session的一級(jí)緩存中的對(duì)象只有該session自己能取到,其他session是取不到的,所以不存在事務(wù)問(wèn)題,實(shí)際所有操作都在一個(gè)事務(wù)中。

而sessionFactory的二級(jí)緩存是所有session共用的,所以要考慮事務(wù)問(wèn)題,在一個(gè)session對(duì)數(shù)據(jù)進(jìn)行操作時(shí),需要保證對(duì)于 其他session不管是查詢數(shù)據(jù)庫(kù)還是查詢二級(jí)緩存取得的數(shù)據(jù)必須是一致的,即如果二級(jí)緩存中有緩存的數(shù)據(jù),那么該數(shù)據(jù)和數(shù)據(jù)庫(kù)中的數(shù)據(jù)是一致的。

因此如果一個(gè)session中對(duì)數(shù)據(jù)進(jìn)行了修改,那么只有在它把事務(wù)提交后才會(huì)把數(shù)據(jù)更新到二級(jí)緩存中(如果是讀寫(xiě)的)。
具體來(lái)說(shuō),如果在一個(gè)session中修改了一條數(shù)據(jù),在它還沒(méi)有寫(xiě)到數(shù)據(jù)庫(kù)時(shí),此時(shí)數(shù)據(jù)庫(kù)和二級(jí)緩存中的數(shù)據(jù)仍然是一致的,它不會(huì)去改變二級(jí)緩 存中的數(shù)據(jù);在數(shù)據(jù)flush刷出,寫(xiě)到數(shù)據(jù)庫(kù)中后,但還沒(méi)有提交,此時(shí)如果有其他session要從數(shù)據(jù)庫(kù)中讀取該數(shù)據(jù)的話應(yīng)該是等待該修改事務(wù)的提 交,因此該修改數(shù)據(jù)的session會(huì)將二級(jí)緩存中的該id對(duì)應(yīng)的數(shù)據(jù)對(duì)象失效掉(或者說(shuō)鎖定),不讓其他session從二級(jí)緩存中取該數(shù)據(jù),以保持和 數(shù)據(jù)庫(kù)的一致性;當(dāng)session將事務(wù)提交后會(huì)將修改后的數(shù)據(jù)更新到二級(jí)緩存中。

對(duì)于沒(méi)有修改的從數(shù)據(jù)庫(kù)中讀到的數(shù)據(jù)都會(huì)更新到二級(jí)緩存中(當(dāng)然必須設(shè)定了該對(duì)象類使用二級(jí)緩存)。