日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NHibernate.3.0.Cookbook第三章第9节的翻译

發布時間:2023/12/2 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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节的翻译的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。