1.session快取
j**a物件生命週期:空引用 隔離引用
快取:快取介於應用程式和永久性儲存源之間,其作用是降低應用程式直接讀寫永久性儲存源的頻率,從而 提高應用的執行效率。
快取內的資料是永久性儲存源中的資料的複製,應用程式在執行時從快取讀寫資料,在特定的時刻或 事件同步快取和永久性儲存源的資料。
session快取:
session 介面的實現類 sessionimpl 中定義了一系列的 j**a 集合,這些集合構成了 session 的緩 存。
session快取的工作過程:
當 session 執行查詢方法時,先從 session 快取中讀取據,如果快取中有則直接讀取,如果快取中 沒有,從資料庫中查詢並載入到 session 快取中,再從快取中讀取。
當 session 執行 s**e()、update() 方法時,將物件持久化到資料庫中並將物件載入到 session 快取中。
session實現快取session session =sessionfactory.opensession();
transaction tx =session.begintransaction();
user u1 = new user("tom");
session.s**e(u1);
//假設分配u的oid=3
tx.commit(); //
提交事務
u1 = null
;user u2 = session.load(user.class
,
new integer(3));
u1 = session.load(user.class
,
new integer(2));
session.close();
//session關閉
u2 = null
;u1 = null;
session清理快取session在某一時間點按照快取中物件的屬性變化來同步更新資料庫的這一過程被稱為 session 清理快取。
快取清理的時間點:
當呼叫 transaction.commit() 方法時,會先清理快取,再向資料庫提交事務;
當顯式呼叫 session.flush() 方法時,會清理快取;
當呼叫 session 的查詢(不包括 load() 和 get() )方法時,如果快取中物件的屬性有變化則清理快取。
session 物件快照session session =sessionfactory.opensession();
transaction tx =session.begintransaction();
user user = session.get(user.class
,
new integer(1));
user.setname("jack");
tx.commit();
session清理快取的方式清理快取模式sethibernateflushmode() 用於設定 session 清理快取的模式。
session
的查詢方法
commit()
flush
()flushmode.always
清理清理
清理flushmode.auto
快取中物件的屬性有變化時清理,沒變化
不清理清理
清理flushmode.commit
不清理清理
清理flushmode.manual
不清理不清理
清理flushmode.never
已過時,被
manual
取代session的三大作用:
session快取有三大作用:
減少資料庫訪問次數,提高資料訪問的效率;
保證快取中的物件與資料庫中相關的記錄同步;
當快取中的持久化物件存在迴圈關聯關係時,session會保證不出現死迴圈,以及由死迴圈引起的堆疊溢位異常。
2.hibernate物件的生命週期
hibernate實體物件生命週期
實體物件的4種狀態
transient(臨時狀態) : 剛剛被 new 關鍵字建立,還沒有被持久化,不在session的快取中。
persistent(持久化狀態) : 已經被持久化,並加入到 session 快取中。
detached(游離狀態) : 已經被持久化,但不再處於 session 快取中。
removed(刪除狀態) : session 已經計畫將其從資料庫刪除,並且不再處於 session 快取中。
清理快取模式
session
的查詢方法
commit()
flush
()flushmode.always
清理清理
清理flushmode.auto
快取中物件的屬性有變化時清理,沒變化
不清理清理
清理flushmode.commit
不清理清理
清理flushmode.manual
不清理不清理
清理flushmode.never
已過時,被
manual
取代
3.hibernate操作持久化物件
session的s**e()方法1. 把物件加入快取中,使其變成持久化物件;
2. 根據對映檔案配置的識別符號生成器為物件分配乙個 oid;
3. 計畫執行乙個 insert,把物件當前屬性值組裝到 insert 語句中;
4. 事務提交後(transaction.commit())永久的將資料儲存到資料庫。
session的update()方法1. 把游離物件重新加入 session 快取中,使其變為持久化物件;
2. 計畫執行乙個 update,將物件當前屬性組裝到 update 語句,執行 update 語句;
3. 事務提交後(transaction.commit())永久的將資料儲存到資料庫;
4. 不管物件屬性有沒有改變都會執行update (通過select-before-update=true改設定的變)。
hibernate 如何區分臨時物件hibernate 如何區分臨時物件:
物件的 oid 為
null
;如果對映檔案中設定了
的 uns**ed-value 屬性,並且物件的 id 值與 uns**ed-value 設定的值相等。
session的delete()方法1.. 檢查傳入的引數是否是持久化物件,如果是持久化物件將其移出 session 快取;
2. 計畫執行乙個 delete,但是並不立即執行;
3. 當 session 清理快取時才執行 delete,比如執行 session.flush()。
session的load()和get()方法load() 與 get() 方法都是根據 oid 載入持久化物件。
load() 與 get() 方法的不同點:
如果資料庫中不存在與 oid 對應的記錄:
load() 會丟擲 objectnotfoundexception 異常;
get() 會返回
null
。預設載入策略:
load() 使用類的延遲載入策略;
get() 使用類的立即載入策略。
物件持久化
物件持久化 ifname main read scores pickle 將字典表序列化成字串pickle.dumps 字串變回字典用pickle.loads s import pickle person s pickle.dumps person 序列化 p pickle.loads s 恢復 序...
Pickle模組資料物件持久化操作
pickle模組的作用是持久化 序列化 的儲存資料。因此我先解釋下 什麼是序列化與反序列化 什麼是物件序列化和物件反序列化。通俗地講,它們的定義如下 序列化 把乙個物件儲存到乙個檔案或資料庫欄位中去 反序列化 在適當的時候把這個檔案再轉化成原來的物件使用 物件的序列化 把物件轉換為位元組序列的過程 ...
python 物件持久化
print open persondb.dat rb read testdemo2.py 讀取資料庫 載入乙個例項的時候,類極其模組的檔案都必須匯入 該類的例項再次載入的時候,對類的源 檔案的修改會自動選取 import testdemo import shelve db shelve.open p...