1. 程式人生 > >Hibernate髒資料檢查和快取清理策略

Hibernate髒資料檢查和快取清理策略

簡述

清理快取:

對當前持久化狀態的快取資料進行檢查,並且將有修改的資料持久化到資料庫當中的過程稱為“清理快取”。清理快取有一定的觸發策略。

策略詳解:

當一個物件在持久化的時候會新增到session快取,快取的同時Hibernate會自動存放一個與當前持久化物件相關的快照(暫時理解成當前持久化物件的一個副本),程式在操作持久化物件的時候並不會修改這個快照,而且修改的資料並不是立即持久化到資料庫當中的,而是一直通過快取的方式放在快取中,然後通過優化策略執行最少的sql。修改的資料存放在快取當中也就意味著不安全,因此會有相應的“清理快取”的觸發事件,比如事務提交commit,顯式flush等,在“清理快取”事件觸發的時候,Hibernate會自動將當前持久化物件的狀態與之前建立的持久化物件的快照進行對比,如果有變化則優化sql並持久化到資料庫當中,如果沒有變化則無動作。這裡要注意:在進行髒資料檢查的時候並不是去資料庫直接取資料,而是從快取當中取到之前的快照進行對比,這有效減少了資料庫的訪問次數。

快取清理時機:

commit:在呼叫commit之前會先呼叫flush清理快取,然後才真正提交事務。

flush:檢查髒資料並執行需要執行的sql。

兩者區別:commit在真正提交事務之前呼叫flush,也就是說,如果沒有最終的提交事務這個動作,這兩者產生的結果是一樣的,都是執行需要執行的sql,但是commit真正提交事務發生以後就是告訴資料庫之前提交的資料是永久性的儲存到資料庫,此時資料庫也會清理自身的一些快取,因為資料庫在收到事務提交之前對於執行過的sql仍然有回滾的餘地,也就有相應的快取;flush則是僅僅對資料庫執行相應的sql,假設此時宕機,之前提交的資料仍然只是不可靠資料會被清理。

對事務提交的理解:

事務的提交是一個過程,就像在commit之前會呼叫flush一樣,flush只是commit的一個準備階段,等之前的sql執行完以後,客戶端會發送一個前期執行的sql的一個確認,確定這些sql執行是永久性的儲存在資料庫中,然後資料庫可以放心的清理自己的快取,在flush與真正的commit之間則有一個過度階段,這個階段客戶端可以傳送rollback進行回滾告訴資料庫之前執行的sql作廢,請資料庫通過自己的快取還原前期的修改。

題外話:

上述中提到,持久化物件的多次修改並不會立即執行相應的sql,而是將修改的資料放在快取當中,通過“清理快取”事件的觸發而持久化到資料庫當中。但是要注意:一般情況下,對於相同的執行動作可以進行合併和優化,比如多條update對同一個持久化物件的操作就可以優化成最終的一條update,這就減少了資料庫的訪問次數,然而如果是不同的執行動作那就得另外看待,雖然操作的可能是同一個持久化物件,但是操作的動作不一樣,一般情況下是不會放在一起優化的,比如save動作和update動作,如果限制性save,然後接著在同一個事務中執行了update動作,這個是不會優化成先執行update然後執行save,而是分別執行並且按照定義的順序執行。

相關推薦

Hibernate資料檢查快取清理策略

簡述 清理快取: 對當前持久化狀態的快取資料進行檢查,並且將有修改的資料持久化到資料庫當中的過程稱為“清理快取”。清理快取有一定的觸發策略。 策略詳解: 當一個物件在持久化的時候會新增到session

Hibernate 資料檢查機制與資料快取

一. 髒資料檢查機制 髒資料:   髒資料並非廢棄或者無用的資料,而是指一個數據物件所攜帶的資訊發生了改變之後的狀態.            如果我們從資料庫中讀取一個物件

[AngularJS面面觀] 1. scope中的Dirty Checking(資料檢查) --- 引言

scope功能概述 scope是AngularJS中的核心概念之一。它的設計思想和實現方式也是希望深入瞭解和學習AngularJS的開發人員必須熟知的。 它的功能主要有以下幾點: 1. 通過資料共享連線Controller和View 2. 事件的監聽和響

[AngularJS面面觀] 2. scope中的Dirty Checking(資料檢查) --- Digest Cycle

Dirty Checking的實現方式 瞭解Angular的開發人員都知道,是一種叫做髒資料檢查(Dirty Checking)的機制實現了雙向繫結這一前端開發中的黑科技。那麼在Angular中到底是如何實現它的呢?本文就一一來揭開它的神祕面紗。 一言以蔽之

關於網頁上的操作留存的cookie快取清理

背景是這樣的,一個網頁形式的登入頁,用WKWebView載入,輸入完賬戶密碼後,點選登入按鈕登入,而後我退出登入,並dismiss掉這個網頁登入頁回到這個登入頁之前的一個,當我點選這一頁的按鈕present這個登入頁的時候,我發現他並沒有出現登入頁,而是直接調取登入方法登

Fresco的使用快取清理

Fresco 是一個強大的圖片載入元件。使用它之後,你不需要再去關心圖片的載入和顯示這些繁瑣的事情!它還有3級快取。所有在圖片載入的時候根本不需要擔心出現OutOfMemoryError等異常出現。 1.新增配置: (1).新增   compile 'com.faceb

『Python思考』資料檢查校驗的函式_不斷更新_不斷改進

        注:如有疑問或好的建議,可以在評論區評論         最近的工作經常跟資料打交道,在工作的過程中也漸漸明白到資料是非常容易出錯的,其中一些方面是因為從別人那裡接收到的資料本身就有

高效能伺服器架構(二):快取清理策略

  雖然使用快取思想似乎是一個很簡單的事情,但是快取機制卻有一個核心的難點,就是——快取清理。我們所說的快取,都是儲存一些資料,但是這些資料往往是會變化的,我們要針對這些變化,清理

MySQL的資料型別建庫策略

 無論是在小得可憐的免費資料庫空間或是大型電子商務網站,合理的設計表結構、充分利用空間是十分必要的。這就要求我們對資料庫系統的常用資料型別有充分的認識。下面我就將我的一點心得寫出來跟大家分享。   一、數字型別   數字型別按照我的分類方法分為三類:整數類、小數類和數

從零開始實現放置遊戲(十二)——實現戰鬥掛機(3)資料字典快取改造

  上一章,我們添加了遊戲的主介面和註冊登入功能。由於距離上上篇間隔較長,可能有些內容想些的後來就忘了。同時,邏輯也不復雜,所以描述比較粗略。   現在隨著模組的增加,整個架構也暴露出一些問題。本章我們將對整個系統進行大規模重構。   比如,之前為了快速開發,rms模組,我們採用了直接訪問資料庫的方式,對

hibernate基礎(三)——主鍵生成策略與flush快取清理

在瞭解此文前,請首先閱讀: 在使用hibernate時,我們還是很有必要將hibernate的內部實現原理來搞清楚一下的。比如,hibernate在儲存一個物件時, 它的

Java三大框架之——Hibernate中的三種資料持久狀態快取機制

Hibernate中的三種狀態     瞬時狀態:剛建立的物件還沒有被Session持久化、快取中不存在這個物件的資料並且資料庫中沒有這個物件對應的資料為瞬時狀態這個時候是沒有OID。   持久狀態:物件經過Session持久化操作,快取中存在這個物件的資料為持久狀

Hibernate實體類編寫規則主鍵策略

有時 由於 rem 數據 數據類型 空間 存在 配置 hyper 一、實體類的編寫規則   1、屬性要是私有的。        2、要有公開的setter和getter方法供外界訪問和修改。        3、每一個實體類要有一個屬性作為唯一值(一般都是使用對於數據表的

redis的常用命令、問題一些快取清理

Q、C盤空間不足 解決方式:多資料夾檢視大小,逐步縮小方位, 最終定位位置: 快取清理目錄:C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Redis [圖片] Q、檢視redis版本和redis埠: 1

mybatishibernate的一級、二級快取

MyBatis一級快取: hibernate一級快取: 基本差不多  HashMap本地快取,作用域為session,session級別的快取,通過get,update可以將物件放到一級快取中,當 Session flush 或 close&n

hibernate三種物件狀態以及載入策略併發控制

對於物件狀態大家先看這張圖 當你的session會話去資料庫中get一個物件也就代表去資料庫裡面查了一次,獲得到的物件也就是資料庫中的資料,當你用get獲取的物件狀態為持久態,也就是你對這個物件進行刪除或者修改的話資料庫中對應的資料也會相應的改變 持久狀態的物件也會根據不同的操作變成臨時狀

Xcode快取清理不用的證書刪除

簡單說兩句 快取 Xcode在編譯工程的時候都會產生快取,長此以往,會佔用大量的硬碟空間。特別對於mac,硬碟空間本來就不富餘。 不用證書 不用的證書刪除亦能節省空間,且太多證書存在也不方便Xcode選擇證書。 清理方法 針對快取 Finder->前往-&g

Hibernate之載入策略(延遲載入與即時載入)抓取策略(fetch)

假設現在有Book和Category兩張表,表的關係為雙向的一對多,表結構如下: 假設現在我想查詢id為2的那本書的書名,使用session.get(...)方法: Session session=HibernateUtil.getSession(); Book

Mybatishibernate的一級,二級快取問題

Mybatis .一級快取(sqlSession)     一級快取是SqlSession自帶的。SqlSession物件被建立,一級快取就存在了。     如果SqlSession物件關閉或呼叫清理方法,會導致快取失效。     快取底層實現就是通過HashMap實現的。

[原創]分散式系統之快取的微觀應用經驗談(三)【資料分片叢集篇】

分散式系統之快取的微觀應用經驗談(三)【資料分片和叢集篇】 前言   近幾個月一直在忙些瑣事,幾乎年後都沒怎麼閒過。忙忙碌碌中就進入了2018年的秋天了,不得不感嘆時間總是如白駒過隙,也不知道收穫了什麼和失去了什麼。最近稍微休息,買了兩本與技術無關的書,其一是 Yann Martel 寫的《The