NHibernate使用無狀態Sessions

2021-09-08 17:23:31 字數 1617 閱讀 6142

當要處理大量的資料,你通常可能會使用更"底層"的api來改善效能,在這次處理中很多時候會關閉一些高階特性.在nhibernate中,無狀態session就是高效能,底層的api.

這個文章,我們會使用乙個無狀態的session來更新我們的電影**.

1.建立一些資料,新增下面**到你的main方法中:

using (var session = sessionfactory.openstatelesssession

()) );

tx.commit();

}}

2.下一步,去更新我們的電影的**,在main方法中新增如下**:

using (var session = sessionfactory.openstatelesssession

())

tx.commit();

}}

3.新增getmovies方法:

static ienumerablegetmovies(istatelesssession session)
4.最後,新增updatemovieprice方法:

static random rnd = new random();

static void updatemovieprice(movie movie)

使用乙個無狀態session,我們新建了1000個電影.無狀態的session沒有實現transactional write-behind,也就是說sql語句不會延遲到我們提交事務才執行.然而,當我們開啟批處理,它們不會立即執行.同一時間會有100條插入語句排隊等候並且一起傳送所有語句.如果我們關閉批處理,這樣就會每呼叫session.insert就會馬上傳送一條語句.

下一步,我們用一條查詢語句獲取所有電影.這些電影是游離態的;它們沒有和乙個session關聯.實體不會與無狀態的session關聯.無論我們使用查詢還是get方法載入實體都是這樣的情況.

因為無狀態session沒有實現自動髒檢查(automatic dirty checking),我們必須呼叫session.update來儲存電影的改變.

乙個無狀態session本質上是乙個標準session的簡化版.它不使用一級快取,也不執行自動髒檢查(automatic dirty checking),也不支援延遲載入.實際上,它甚至沒有儲存實體的引用,以幫助防止處理數千實體時記憶體洩漏.級聯被忽略.你每次都必須明確地插入,更新,或者刪除每個實體.無狀態session還會忽略二級快取,事件監聽(event listeners),***(interceptors),甚至nhibernate.sql的log4net記錄器.

儘管有這些侷限性,當你需要使用真實物件(real objects)時,無狀態session在高效能批處理情景中是非常有用的.當你要用原始資料(raw data)時,這裡通常有更好的代替方案,例如簡單的舊的sql(plain old sql),hql批處理(hql bulk actions),sqlbulkcopy,或者etl tools.至於簡單的舊的sql(plain old sql),session.connection屬性使得可以簡單地使用ado.net的connection物件,然後你可以像以前那樣寫ado.net**.

無狀態登入

有狀態服務,即服務端需要記錄每次會話的客戶端資訊,從而識別客戶端身份,根據使用者身份進行請求的處理,典型的設計如tomcat中的session。例如登入 使用者登入後,我們把登入者的資訊儲存在服務端session中,並且給使用者乙個cookie值,記錄對應的session。然後下次請求,使用者攜帶c...

react無狀態元件

乙個普通元件只有render函式的時候,我們完全可以通過乙個無狀態元件來替換掉這個普通元件。無狀態元件相對於這個普通函式的優勢如下 無狀態元件的效能比較高。因為無狀態元件就是乙個函式。而普通元件是js裡面的乙個類,而這個類生成的物件裡還有生命週期函式,他執行起來既要執行生命週期函式,還要執行rend...

無狀態登入原理

1.1.什麼是有狀態?有狀態服務,即服務端需要記錄每次會話的客戶端資訊,從而識別客戶端身份,根據使用者身份進行請求的處理,典型的設計如tomcat中的session。例如登入 使用者登入後,我們把登入者的資訊儲存在服務端session中,並且給使用者乙個cookie值,記錄對應的session。然後...