精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Hibernate的flush機制詳解

開發 后端
Hibernate flush機制和對我們程序可能帶來的影響以及相應的解決方法,Hibernate的緩存機制還會在其他的方面給我們的程序帶來一些意想不到的影響。

隨著Hibernate在Java開發中的廣泛應用,我們在使用Hibernate 進行對象持久化操作中也遇到了各種各樣的問題。

這些問題往往都是我們對Hibernate缺乏了解所致,這里我講個我從前遇到關于Hibernate flush的問題及一些想法,希望能給大家一點借鑒和幫助。
 
這是在一次事務提交時遇到的異常。

an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
net.sf.hibernate.AssertionFailure: possible nonthreadsafe access to session
注:非possible non-threadsafe access to the session (那是另外的錯誤,類似但不一樣)
 
這個異常應該很多的朋友都遇到過,原因可能各不相同。但所有的異常都應該是在Hibernate flush或者事務提交的過程中發生的。這一般由我們在事務開始至事務提交的過程中進行了不正確的操作導致,也會在多線程同時操作一個Session時發生,這里我們僅僅討論單線程的情況,多線程除了線程同步外基本與此相同。
 
至于具體是什么樣的錯誤操作那?我給大家看一個例子(假設Hibernate配置正確,為保持代碼簡潔,不引入包及處理任何異常)

  1. SessionFactory sf = new Configuration().configure().buildSessionFactory() ;  
  2. Session s = sf.openSession();  
  3. Cat cat = new Cat();  
  4.  
  5. Transaction tran = s.beginTransaction(); (1)  
  6. s.save(cat); (2)(此處同樣可以為update delete)  
  7. s.evict(cat); (3)  
  8. tran.commit(); (4)  
  9. s.close();(5) 

這就是引起此異常的典型錯誤。我當時就遇到了這個異常,檢查代碼時根本沒感覺到這段代碼出了問題,想當然的認為在Session上開始一個事務,通過Session將對象存入數據庫,再將這個對象從Session上拆離,提交事務,這是一個很正常的流程。如果這里正常的話,那問題一定在別處。

問題恰恰就在這里,我的想法也許沒有錯,但是一個錯誤的論據所引出的觀點永遠都不可能是正確的。因為我一直以為直接在對數據庫進行操作,忘記了在我與數據庫之間隔了一個Hibernate,Hibernate flush在為我們提供持久化服務的同時,也改變了我們對數據庫的操作方式,這種方式與我們直接的數據庫操作有著很多的不同,正因為我們對這種方式沒有一個大致的了解造成了我們的應用并未得到預先設想的結果。
 
那Hibernate的持久化機制到底有什么不同那?簡單的說,Hibernate在數據庫層之上實現了一個緩存區,當應用save或者update一個對象時,Hibernate并未將這個對象實際的寫入數據庫中,而僅僅是在緩存中根據應用的行為做了登記,在真正需要將緩存中的數據flush入數據庫時才執行先前登記的所有行為。
 
在實際執行的過程中,每個Session是通過幾個映射和集合來維護所有與該Session建立了關聯的對象以及應用對這些對象所進行的操作的,與我們這次討論有關的有entityEntries(與Session相關聯的對象的映射)、insertions(所有的插入操作集合)、deletions(刪除操作集合)、updates(更新操作集合)。下面我就開始解釋在最開始的例子中,Hibernate到底是怎樣運作的。

(1)生成一個事務的對象,并標記當前的Session處于事務狀態(注:此時并未啟動數據庫級事務)。

(2)應用使用s.save保存cat對象,這個時候Session將cat這個對象放入entityEntries,用來標記cat已經和當前的會話建立了關聯,由于應用對cat做了保存的操作,Session還要在insertions中登記應用的這個插入行為(行為包括:對象引用、對象id、Session、持久化處理類)。

(3)s.evict(cat)將cat對象從s會話中拆離,這時s會從entityEntries中將cat這個對象移出。

(4)事務提交,需要將所有緩存flush入數據庫,Session啟動一個事務,并按照insert,update,……,delete的順序提交所有之前登記的操作(注意:所有insert執行完畢后才會執行update,這里的特殊處理也可能會將你的程序搞得一團糟,如需要控制操作的執行順序,要善于使用flush),現在cat不在entityEntries中,但在執行insert的行為時只需要訪問insertions就足夠了,所以此時不會有任何的異常。異常出現在插入后通知Session該對象已經插入完畢這個步驟上,這個步驟中需要將entityEntries中cat的existsInDatabase標志置為true,由于cat并不存在于entityEntries中,此時Hibernate就認為insertions和entityEntries可能因為線程安全的問題產生了不同步(也不知道Hibernate的開發者是否考慮到例子中的處理方式,如果沒有的話,這也許算是一個bug吧),于是一個net.sf.hibernate.AssertionFailure就被拋出,程序終止。
 
我想現在大家應該明白例子中的程序到底哪里有問題了吧,我們的錯誤的認為s.save會立即的執行,而將cat對象過早的與Session拆離,造成了Session的insertions和entityEntries中內容的不同步。所以我們在做此類操作時一定要清楚Hibernate什么時候會將數據flush入數據庫,在未flush之前不要將已進行操作的對象從Session上拆離。
 
對于這個錯誤的解決方法是,我們可以在(2)和(3)之間插入一個s.flush()強制Session將緩存中的數據flush入數據庫(此時Hibernate會提前啟動事務,將(2)中的save登記的insert語句登記在數據庫事務中,并將所有操作集合清空),這樣在(4)事務提交時insertions集合就已經是空的了,即使我們拆離了cat也不會有任何的異常了。

前面簡單的介紹了一下Hibernate flush機制和對我們程序可能帶來的影響以及相應的解決方法,Hibernate的緩存機制還會在其他的方面給我們的程序帶來一些意想不到的影響。看下面的例子:

  1. (name為cat表的主鍵)  
  2. Cat cat = new Cat();  
  3. cat.setName(“tom”);  
  4. s.save(cat);  
  5.  
  6. cat.setName(“mary”);  
  7. s.update(cat);(6)  
  8.  
  9. Cat littleCat = new Cat();  
  10. littleCat.setName(“tom”);  
  11. s.save(littleCat);  
  12.  
  13. s.flush(); 

這個例子看起來有什么問題?估計不了解Hibernate緩存機制的人多半會說沒有問題,但它也一樣不能按照我們的思路正常運行,在Hibernate flush過程中會產生主鍵沖突,可能你想問:“在save(littleCat)之前不是已經更改cat.name并已經更新了么?為什么還會發生主鍵沖突那?”這里的原因就是我在解釋第一個例子時所提到的緩存flush順序的問題,Hibernate按照insert,update,……,delete的順序提交所有登記的操作,所以你的s.update(cat)雖然在程序中出現在s.save(littleCat)之前,但是在flush的過程中,所有的save都將在update之前執行,這就造成了主鍵沖突的發生。
 
這個例子中的更改方法一樣是在(6)之后加入s.flush()強制Session在保存littleCat之前更新cat的name。這樣在第二次flush時就只會執行s.save(littleCat)這次登記的動作,這樣就不會出現主鍵沖突的狀況。
 
再看一個例子(很奇怪的例子,但是能夠說明問題)

  1. Cat cat = new Cat();  
  2. cat.setName(“tom”);  
  3. s.save(cat); (7)  
  4. s.delete(cat);(8)  
  5.  
  6. cat.id=null;(9)  
  7. s.save(cat);(10)  
  8. s.flush();  

這個例子在運行時會產生異常net.sf.hibernate.HibernateException: identifier of an instance of Cat altered from 8b818e920a86f038010a86f03a9d0001 to null
 
這里例子也是有關于緩存的問題,但是原因稍有不同:
(7)和(2)的處理相同。
(8)Session會在deletions中登記這個刪除動作,同時更新entityEntries中該對象的登記狀態為DELETED。
(9)Cat類的標識符字段為id,將其置為null便于重新分配id并保存進數據庫。
(10)此時Session會首先在entityEntries查找cat對象是否曾經與Session做過關聯,因為cat只改變了屬性值,引用并未改變,所以會取得狀態為DELETED的那個登記對象。由于第二次保存的對象已經在當前Session中刪除,save會強制Session將緩存flush才會繼續,flush的過程中首先要執行最開始的save動作,在這個save中檢查了cat這個對象的id是否與原來執行動作時的id相同。不幸的是,此時cat的id被賦為null,異常被拋出,程序終止(此處要注意,我們在以后的開發過程盡量不要在flush之前改變已經進行了操作的對象的id)。
 
這個例子中的錯誤也是由于緩存的延時更新造成的(當然,與不正規的使用Hibernate也有關系),處理方法有兩種:

1、在(8)之后flush,這樣就可以保證(10)處save將cat作為一個全新的對象進行保存。
2、刪除(9),這樣第二次save所引起的強制flush可以正常的執行,在數據庫中插入cat對象后將其刪除,然后繼續第二次save重新插入cat對象,此時cat的id仍與從前一致。
 
這兩種方法可以根據不同的需要來使用,呵呵,總覺得好像是很不正規的方式來解決問題,但是問題本身也不夠正規,只希望能夠在應用開發中給大家一些幫助,不對的地方也希望各位給與指正。
 
總的來說,由于Hibernate的flush處理機制,我們在一些復雜的對象更新和保存的過程中就要考慮數據庫操作順序的改變以及延時flush是否對程序的結果有影響。如果確實存在著影響,那就可以在需要保持這種操作順序的位置加入flush強制Hibernate將緩存中記錄的操作flush入數據庫,這樣看起來也許不太美觀,但很有效。

【編輯推薦】

  1. Hibernate入門學習寶典
  2. Hibernate屬性簡單分析
  3. Struts-Spring-Hibernate案例
  4. 簡述Hibernate配置連接池
  5. 解說Hibernate的工作原理實例
責任編輯:仲衡 來源: javaresearch
相關推薦

2012-06-02 00:55:44

HibernateflushJava

2009-09-25 16:08:12

Hibernate f

2009-09-24 16:13:05

Hibernate S

2009-06-18 14:51:12

Hibernate緩存Hibernate

2009-06-29 08:50:20

Hibernate主鍵

2009-06-17 15:43:03

Hibernate緩存

2009-09-24 17:24:20

Hibernate S

2009-09-21 17:33:50

Hibernate基礎

2009-09-22 09:31:15

Hibernate主鍵

2009-09-24 15:53:00

Hibernate J

2009-09-27 13:57:19

Hibernate樹形

2009-09-25 12:59:53

Hibernate事務

2009-06-02 14:46:26

Hibernate關系映射教程

2011-05-26 15:23:34

JavaReflection

2020-04-24 15:44:50

MySQL數據庫鎖機制

2009-09-27 10:28:12

Hibernate.p

2009-07-09 16:01:27

2009-09-22 17:25:41

優化Hibernate

2009-09-24 13:03:38

Hibernate C

2009-07-02 09:38:17

Hibernate延時
點贊
收藏

51CTO技術棧公眾號

91网上在线视频| 国内自拍一区| 538在线一区二区精品国产| 欧美xxxx吸乳| 污视频网站在线播放| 97人人模人人爽人人澡| 国产亚洲一级高清| 久久久精品国产一区二区三区| 羞羞影院体验区| 成人看的羞羞网站| 欧美成人video| 欧美极品欧美精品欧美图片| 欧美jizz18性欧美| 成人高清视频在线观看| 国产精品久久久久久久av电影| 天天综合天天做| 久9久9色综合| 精品国产1区2区3区| 一级在线免费视频| 超碰中文在线| 亚洲三级理论片| 欧美日韩一区二区视频在线| 精品人妻一区二区三区换脸明星| 性伦欧美刺激片在线观看| 久久激情五月丁香伊人| 国产人妻一区二区| 澳门成人av| 欧美老年两性高潮| 久久久精品在线视频| 青春草在线视频| 中文字幕一区二区三区蜜月| 免费精品视频一区二区三区| 亚洲精品久久久久久动漫器材一区| 日本一不卡视频| 欧美亚洲第一页| 中文字幕第28页| 欧美在线高清| 久久五月天综合| www.黄色com| 精品一区二区三区中文字幕老牛| 亚洲电影天堂av| 人妻体体内射精一区二区| 国产在视频一区二区三区吞精| 精品国产91久久久| 国产精品成人久久电影| 午夜小视频在线观看| 亚洲天堂久久久久久久| 亚洲三区四区| 日本中文字幕在线2020| 国产精品美女久久久久久久久 | 丰满少妇大力进入| 免费不卡av| 一二三区精品福利视频| 男人草女人视频| 欧美性video| 亚洲成人综合网站| 久久久性生活视频| 影音先锋在线视频| 国产精品久久久久久久久久辛辛 | 日韩精品极品毛片系列视频| 精品伦一区二区三区| 视频免费一区二区| 欧美白人最猛性xxxxx69交| 成人在线短视频| 香蕉大人久久国产成人av| 欧美一级欧美一级在线播放| 国产黑丝在线视频| 91蝌蚪精品视频| 亚洲激情视频在线观看| 少妇毛片一区二区三区| 精品国产精品国产偷麻豆| 中文字幕在线看视频国产欧美在线看完整| 亚洲一级黄色录像| 一级毛片免费高清中文字幕久久网| 麻豆成人在线看| 国产亚洲自拍av| 亚洲深夜影院| 国产美女扒开尿口久久久| 一区二区www| 国产一区二区三区免费在线观看| caoporen国产精品| 暖暖视频在线免费观看| 国产精品丝袜久久久久久app| 一区视频二区视频| heyzo一区| 色香蕉久久蜜桃| www.五月天色| 欧美aaaaaaaa牛牛影院| 影音先锋日韩有码| 久久久国产精品黄毛片| 久久亚洲精品伦理| 91免费看网站| 国产小视频在线| 亚洲精品日韩专区silk| 日本三级免费网站| 色8久久久久| 亚洲第一色在线| 少妇愉情理伦三级| 在线欧美一区| 成人激情春色网| 桃花色综合影院| 亚洲色图视频网| 国产1区2区在线| 亚洲精品一区国产| 中文字幕日韩免费视频| 精品成人久久久| 精品一区二区综合| 青娱乐一区二区| 牛牛电影国产一区二区| 欧美视频在线播放| 大乳护士喂奶hd| 91精品一区二区三区综合在线爱| 78m国产成人精品视频| 国产色在线视频| 欧美国产禁国产网站cc| 僵尸世界大战2 在线播放| jizz欧美| 亚洲视频axxx| 国产微拍精品一区| 国产精品一区二区久久精品爱涩| 久久久久久国产精品一区| 成人在线免费看片| 欧美日韩中文字幕一区| 久久久久久久久久久国产精品| 欧美精品麻豆| 亚洲va久久久噜噜噜久久天堂| 黄色影院在线播放| 精品国产精品三级精品av网址| 91人妻一区二区三区| 91蜜臀精品国产自偷在线| 国产成人精品一区二区三区| 天堂91在线| 午夜久久久久久久久| www日本在线观看| 图片小说视频色综合| 国产欧美精品久久久| 福利在线视频导航| 色天使久久综合网天天| 亚洲av片不卡无码久久| 亚洲精品社区| 精品一区在线播放| 欧美gv在线| 亚洲精品一区在线观看香蕉| 日韩不卡在线播放| 久久这里只有精品首页| 国产最新免费视频| 欧美五码在线| 91av国产在线| 香蕉久久国产av一区二区| 欧美日韩国产激情| 成年人网站免费在线观看| 免费中文字幕日韩欧美| 欧美日韩电影一区二区| 日本综合视频| 日韩中文字幕国产精品| 亚洲无码久久久久| 中文字幕亚洲成人| 一个人看的视频www| 亚洲天堂偷拍| 久久国产精品一区二区三区| 成人影院入口| 最近2019好看的中文字幕免费| 自拍偷拍精品视频| 1024精品合集| 日本wwwwwww| 亚洲另类自拍| 日本一区二区三区免费看| 久久人体av| 欧美乱妇40p| 女人18毛片一区二区三区| 亚洲一区二区中文在线| 五十路六十路七十路熟婆 | 自拍偷拍亚洲激情| xxx中文字幕| 日韩视频免费| 日韩影片在线播放| 国产精品久久久久久久久久久久久久久| 久久国产精品久久久久久| 欧美一级特黄aaaaaa| 色8久久精品久久久久久蜜| 操她视频在线观看| 国产a区久久久| 亚洲成熟丰满熟妇高潮xxxxx| 日韩理论电影| 国产超碰91| 欧美日韩国产网站| 久久免费视频网站| 91啦中文在线| 亚洲国产精品va在线看黑人| 中文无码精品一区二区三区| 亚洲国产另类精品专区| 欧美aaa级片| 粉嫩蜜臀av国产精品网站| 日本三级免费观看| 欧美黄色一区| 日韩欧美亚洲v片| 99精品在免费线中文字幕网站一区 | 中文字幕免费高清| 国产一区二区剧情av在线| 日韩欧美一区三区| 久久精品亚洲人成影院 | 国内成人在线| 亚洲精品一区二| 日韩激情毛片| 91成人伦理在线电影| 97欧美成人| 韩日欧美一区二区| 黄av在线播放| 夜夜嗨av一区二区三区免费区| 国精产品一品二品国精品69xx| 欧美午夜精品免费| 日本韩国欧美中文字幕| 亚洲午夜一区二区| 欧美色视频一区二区三区在线观看| 99精品欧美一区| 在线观看欧美一区二区| 精品一区二区在线观看| 九九视频精品在线观看| 午夜综合激情| 97国产在线播放| 亚洲福利免费| 丁香色欲久久久久久综合网| 波多野结衣在线观看一区二区三区 | 中文字幕中文在线不卡住| 玖草视频在线观看| 国产成人aaa| 国产黑丝在线视频| 国内外成人在线视频| 日日噜噜夜夜狠狠| 久久久久国产精品一区三寸| 99精品人妻少妇一区二区| 亚洲午夜极品| 欧美黄色免费网址| 欧美 日韩 国产精品免费观看| 亚洲午夜精品一区二区三区| 精品国产乱码久久久| 欧美日韩亚洲综合一区二区三区激情在线| 国产乱人伦精品一区| 国产精品区二区三区日本| 亚洲2区在线| 51国偷自产一区二区三区| 亚洲高清影院| 成人欧美在线视频| 日韩精品第二页| 国产欧美一区二区| 久久久久久久性潮| 91免费在线视频| 国产午夜亚洲精品一级在线| 91香蕉亚洲精品| 国产精品亚洲欧美一级在线| 91精品久久久久久久久久久久久久| 亚洲四虎影院| 国产精品日韩欧美大师| 精品自拍视频| 亚洲一区二区三区香蕉 | 蜜桃视频一区二区三区| 天天操天天爽天天射| 日韩av中文字幕一区二区| 日本激情综合网| 国内精品久久久久影院薰衣草 | 亚洲天堂视频在线| 69久久夜色精品国产69蝌蚪网| 国产精品永久久久久久久久久| 欧美电影一区二区三区| 亚洲AV无码精品自拍| 精品国精品自拍自在线| 无码精品人妻一区二区三区影院| 国产视频久久久| 在线观看黄av| 欧美xxxx做受欧美.88| 国产天堂在线播放视频| 欧美在线视频在线播放完整版免费观看| 无遮挡在线观看| 国产精品九九九| 涩爱av色老久久精品偷偷鲁| 久久久综合香蕉尹人综合网| 成人看的视频| 国产曰肥老太婆无遮挡| 久久一日本道色综合久久| 欧美wwwwwww| 国产成人免费高清| 全黄一级裸体片| 亚洲人成亚洲人成在线观看图片 | 奶水喷射视频一区| 奇米视频7777| 99精品欧美一区| 91传媒免费观看| 欧美性生活大片免费观看网址| 一本到在线视频| 亚洲精品suv精品一区二区| 91网页在线观看| 午夜精品久久久久久久99热浪潮| 日本综合久久| 国产伦精品一区二区三区免 | 真人抽搐一进一出视频| 日本怡春院一区二区| jjzzjjzz欧美69巨大| 欧美韩国日本不卡| 国产污视频在线看| 欧美群妇大交群中文字幕| 日本成人动漫在线观看| 久久久精品国产一区二区| 不卡一二三区| 国产精品二区二区三区| 久久麻豆精品| 中文字幕乱码人妻综合二区三区 | 岛国视频一区免费观看| 日韩久久综合| 免费日韩视频在线观看| 成人综合在线网站| 69夜色精品国产69乱| 日本久久电影网| 婷婷五月综合久久中文字幕| 久久精品国产91精品亚洲| 丝袜美腿一区| 国产视频不卡| 欧美成人一品| 亚洲黄色片免费| 中文字幕高清一区| 中文人妻av久久人妻18| 亚洲精品99久久久久| 羞羞的视频在线观看| 成人黄色午夜影院| 日本高清免费电影一区| 欧美性大战久久久久xxx| 成人午夜在线免费| 欧美人妻精品一区二区免费看| 欧美精品日韩一本| 天堂а√在线资源在线| 国产精品久久视频| 欧美人妖在线| 国产av人人夜夜澡人人爽| 久久人人97超碰com| 特级西西444www大精品视频免费看| 日韩情涩欧美日韩视频| 蜜桃视频在线观看www社区| 国产精品视频自在线| 精品国产中文字幕第一页| 日本999视频| 国产欧美一区二区在线| 在线观看日本网站| 国产视频久久久| 丝袜美腿一区| 日韩国产一区久久| 日韩电影在线观看网站| 国产又黄又粗视频| 在线日韩一区二区| av影片在线看| 成人性生交大片免费看视频直播 | 蜜桃传媒一区二区三区| 成人短视频下载| 日韩欧美性视频| 国产视频精品xxxx| 成人啊v在线| 一区二区三区国产福利| 国产一区久久久| 免费人成年激情视频在线观看| 欧美大片在线观看一区| xxx.xxx欧美| 久久亚洲免费| 美女www一区二区| 九九热最新地址| 欧美精品一区二区三区四区 | 国产日产久久高清欧美一区| 欧美国产美女| 久久久国产精品久久久| 亚洲国产成人av好男人在线观看| 手机在线精品视频| 日韩美女视频免费在线观看| 色乱码一区二区三区网站| 国产天堂素人系列在线视频| 欧美专区日韩专区| 麻豆视频网站在线观看| 国产成人精品自拍| 久久成人亚洲| 5566中文字幕| 亚洲第一网站免费视频| 日韩新的三级电影| 9999在线观看| 菠萝蜜视频在线观看一区| 无码日韩精品一区二区| 久久天天躁日日躁| 欧美人与动xxxxz0oz| 日韩精品你懂的| 亚洲一二三四在线| 成人高清免费观看mv| 亚洲最大成人在线| 男人的天堂成人在线| 丰满少妇被猛烈进入一区二区| 欧美又粗又大又爽| 午夜精品久久久久久久99热影院| 蜜桃成人精品| 国产欧美在线看| 红桃视频亚洲| 色综合99久久久无码国产精品| 日韩亚洲欧美综合| 欧美性suv| 热99久久精品| 久草视频一区二区| 精品福利视频导航|