本文主要通過原始碼,概述一下session的查詢過程。
主要api有get、load。他們基本過程是類似的;
以get為例:
session
public object get(string entityname, serializable id) throws hibernateexception;
呼叫sessionimpl:
public object get(string entityname, serializable id) throws hibernateexception
finally
}
fireload 主要是出發***;
主要獲取過程就是 event.getresult();
event為loadevent,其實是乙個很簡單的類,其getresult也是非常簡單,
public object getresult()
public void setresult(object result)
其中result其實是由 fireload(event, loadeventlistener.get) 執行過程中賦值的
private void fireload(loadevent event, loadtype loadtype)
}
當然,從這段**中我們仍然看不出什麼頭緒,我們繼續研究
loadeventlistener[i].onload(event, loadtype);
經查詢發現loadevent有乙個listener :defaultloadeventlistener
其onload方法主要呼叫
event.setresult( load(。。。。 ) ); 也就是 defaultloadeventlistener 的load方法,而其中主要又呼叫
object entity = doload(event, persister, keytoload, options); 來進行「查詢」:
protected object doload(
final loadevent event,
final entitypersister persister,
final entitykey keytoload,
final loadeventlistener.loadtype options)
throws hibernateexception
if ( entity != null )
//2entity = loadfromsecondlevelcache(event, persister, options);
if ( entity != null )
//3return loadfromdatasource(event, persister, keytoload, options);
}
去掉其中的注釋和logging部分,我們終於可以看到乙個比較明顯的語義了!!:::
1、loadfromsessioncache————從session快取中查詢, 如果找不到,則2
2、loadfromsecondlevelcache————從二級快取中查詢(如果支援),如果找不到,則3(即從sessionfactory查詢)
3、loadfromdatasource————仍然查詢不到,則從資料庫中查詢——這回是真正的查詢
loadfromsessioncache 關鍵:
object old = session.getentityusinginterceptor( keytoload );
loadfromsecondlevelcache關鍵:
object ce = persister.getcache().get( ck, source.gettimestamp() );
loadfromdatasource關鍵:
object entity = persister.load(
event.getentityid(),
event.getinstancetoload(),
event.getlockmode(),
source
);先寫到這裡,有時間再仔細看看。
openTLD 原始碼解讀
首先是run tld 在其次就是tldexample 最後到了初始化函式tldinit 第乙個比較關鍵的函式 bb scan 將影象網格化,將首先 scale 1.2.10 10 21 個規格 在每個規格上打網格 這個函式有乙個比較重要的方法 ntuples 就是重複 因為網格上的點很多點有相同的x...
thinkphp原始碼解讀
thinkphp原始碼解讀 thinkphp原始碼的根目錄下是 index.php,是系統預設的 主頁,index.php中首先檢測的是 php執行環境,如果php版本小於 5.3.0則退出執行,定義是否為除錯模式,定義應用目錄,引入入口檔案。thinkphp是整個框架的入口檔案,在thinkphp...
HashMap原始碼解讀
一 建立乙個hashmap都做了哪些工作?mapmap new hashmap hahmap無參構造方法 public hashmap 可以看到設定了載入因子 預設0.75 閾值 預設容量16 預設載入因子0.75 12 table是hashmap內部資料儲存結構entry陣列。當hashmap的s...