NHibernate.3.0.Cookbook第三章第9节的翻译
Using stateless sessions
使用無狀態會話
當進行大量數據處理的時候,可能會放棄使用一些高級特性,而使用更接近底層的API來提高性能.在NHibernate中,這種高性能的底層API就是無狀態的會話.本節介紹如何使用無狀態會話來更新movie對象的價格.
準備
使用第一章的Eg.Core和第二章的Configuring NHibernate with App.config來創建一個控制臺應用程序.
步驟
1.?? 先創建一些數據,在Main方法中添加下面的代碼:
View Code using (var session = sessionFactory.OpenStatelessSession()) {using (var tx = session.BeginTransaction()){for (int i = 0; i < 1000; i++)session.Insert(new Movie(){Name = "Movie " + i.ToString(),Description = "A great movie!",UnitPrice = 14.95M,Director = "Johnny Smith"});tx.Commit();} }2.?? 下一步,更新movie的價格,在Main方法中添加下面的代碼:
View Code using (var session = sessionFactory.OpenStatelessSession()) {using (var tx = session.BeginTransaction()){var movies = GetMovies(session);foreach (var movie in movies){UpdateMoviePrice(movie);session.Update(movie);}tx.Commit();} }3.?? 添加GetMovies方法:
View Code static IEnumerable<Movie> GetMovies(IStatelessSession session) {return session.CreateQuery("from Movie").List<Movie>(); }4.?? 最后,添加UpdateMoviePrice方法:
View Code static Random rnd = new Random(); static void UpdateMoviePrice(Movie movie) {// Random price between $9.95 and $24.95movie.UnitPrice = (decimal) rnd.Next(10, 26) - 0.05M; }原理
使用無狀態會話,我們創建了1000個movie對象.無狀態會話不支持事務處理的遲寫機制,這意味著SQL語句不再被延遲到提交事務時.然而因為我們打開了批處理功能,所以這些語句也不會馬上生效.累積100條insert語句后會被一起發送.如果關閉了批處理功能,每次調用session.Insert時,每條語句都會被立即執行,也就是一次發送一條語句.
下一步,使用了一個查詢從數據庫中獲取了所有的movie.這些movie是分離狀態的,沒有同會話相關聯.實體無法和無狀態會話相關聯.情況就是這樣的,無論是通過查詢獲得實體還是通過Get方法.因為無狀態會話無法實現自動臟校驗,所以我們必須調用session.Update來保存對每個movie的更改.
擴展
無狀態會話本質上是標準NHibernate會話的精簡版.她不使用一級緩存也不執行自動臟校驗,并且不支持延遲加載.事實上,她設置不保持對實體的引用,在處理成千上萬的實體時,保持對實體的引用有助于避免內存泄露.級聯是被忽略的.必須顯式調用insert, update,或delete來操作每個實體,不會級聯.無狀態會話也會繞開二級緩存,事件監視器,攔截器,甚至NHibernate.SQL的log4net日志記錄器.
忽略這些限制,無狀態會話在需要處理實際對象的高性能批處理環境下是非常有用的.當你可以處理原始數據時,通常有更好的替代品就像原始的SQL,HQL bulk actions,SqlBulkCopy或者是ETL tools.對于原始的SQL,可以從session.Connection來簡單訪問ADO.NET連接對象,而且你可以如往常一樣寫你的ADO.NET代碼.
轉載于:https://www.cnblogs.com/carfieldSE/archive/2012/07/15/2592049.html
總結
以上是生活随笔為你收集整理的NHibernate.3.0.Cookbook第三章第9节的翻译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tiny Wings 为什么能迅速成为
- 下一篇: 上周热点回顾(7.9-7.15)