最近在看hibernate在load entity過程中的操作, 包括為實體類做增強,自動flush,一級快取,在這裡記錄一下,慢慢會繼續更新。
defaultloadeventlistener:
final persistencecontext persistencecontext = event.getsession().getpersistencecontext();
statefulpersistencecontext.proxiesbykey 快取實體
defaultloadeventlistener:
private object createproxyifnecessary(
object proxy = persister.createproxy( event.getentityid(), event.getsession() );
persistencecontext.getbatchfetchqueue().addbatchloadableentitykey( keytoload );
persistencecontext.addproxy( keytoload, proxy );
eventlistenerregistryimpl 註冊所有listener,
private mapregisteredeventlistenersmap = preparelistenermap();
preparelistenermap初始化需要的listener,呼叫preparelisteners完成實際動作。
preparelisteners(
pre_collection_update,
workmap
);
eventtype與lisnter介面類對應,儲存了event對應的實際處理的lisnter類。
private eventtype(string eventname, class<? extends t> baselistenerinte***ce)
本身用static方式初始化了eventype對應的listener。
public static final eventtypemerge
= new eventtype( "merge", mergeeventlistener.class );
listener處理實際的event,以defaultautoflusheventlistener為例,該listener接收到autoflushevent, 會查詢該event內關聯的session(用session介面的子介面eventsource),session的實現類是sessionimpl,其宣告如下
public final class sessionimpl extends abstractsessionimpl implements eventsource
defaultautoflusheventlistener的方法onautoflush(autoflushevent event) 對event的處理如下:
final int oldsize = source.getactionqueue().numberofcollectionremovals();
flusheverythingtoexecutions(event);
if ( flushisreallyneeded(event, source) )
}
performexecutions中有如下呼叫,可以看到其根據session中儲存的actionqueue進行處理,對action順序進行重排:
session.getactionqueue().prepareactions();
session.getactionqueue().executeactions();
prepareaction呼叫儲存的action的beforeexecutions方法,對action進行預處理
public void prepareactions() throws hibernateexception
executeactions則按順序執行儲存的action,實際呼叫的是action的execute方法:
public void executeactions() throws hibernateexception
executeactions( insertions );
executeactions( updates );
// do before actions are handled in the other collection queues
executeactions( collectionqueuedops );
executeactions( collectionremovals );
executeactions( collectionupdates );
executeactions( collectioncreations );
executeactions( deletions );
}
各種crud的action都實現了executable的介面,該介面主要定義了execute()和beforeexecutions()方法,用於執行action前的一些處理操作和之後的實際操作。
action的一些繼承層次如下:
public final class entityinsertaction extends abstractentityinsertaction
public abstract class abstractentityinsertaction extends entityaction
public abstract class entityaction
implements executable, serializable, comparable, aftertransactioncompletionprocess
performexecutions(eventsource session) 中有這麼一句:
session.gettransactioncoordinator().getjdbccoordinator().flushending();
實現類是transactioncoordinatorimpl, 其建構函式中:
this.jdbccoordinator = new jdbccoordinatorimpl( usersuppliedconnection, this );
this.transactionenvironment = transactioncontext.gettransactionenvironment();
flushending中涉及到乙個flushdepth,主要處理可能產生多個begin呼叫,每個begin呼叫都會讓這個depth數量+1, 保證最後的end處理同樣數量的flush.
public void flushending()
if ( flushdepth == 0 )
afterstatementexecution();
}
乙個查詢的處理流程:
servlet.processrequest->jdbctransaction.beforetransactioncommit->sessionimpl.managedflush->sessinimpl.flush->defaultflusheventlistener.onflush
->abstractflushingeventlistener.performexecutior->jdbccoordinatorimpl.flushending
hibernate 原始碼分析
settingfactory類 設定屬性類。其中有buildsettings properties properties 方法,設定自定義屬性。設定類和表之間的對映。class 進去,table出來。了解不清晰。binding類 po和資料庫中表及其之間的對映的繫結。configuration類,配...
Spark (原始碼) 總結 雜
1.spark submit 指令碼,在指令碼裡呼叫了org.apache.spark.deloy.sparksubmit 類 2.sparksubmit.scala main方法 override def main args array string unit private def submit...
Hibernate原始碼解讀 查詢
本文主要通過原始碼,概述一下session的查詢過程。主要api有get load。他們基本過程是類似的 以get為例 session public object get string entityname,serializable id throws hibernateexception 呼叫se...