Dot-Net

如何非同步執行 NHibenate 查詢?

  • March 21, 2010

提高伺服器應用程序可擴展性的一種方法是非同步執行 IO 綁定操作(讀取文件、套接字、Web 請求、數據庫請求等)。這並不意味著在 ThreadPool 中執行它們,這只會在執行操作時阻塞執行緒。正確的方法是使用非同步 API(BeginRead、BeginGetResponse、BeginExecuteReader 等)。CLR vi C#書中很好地描述了這個問題。

這是一些關於Linq to SQL 中的非同步查詢的文章。

有什麼方法可以非同步執行 Nhibernate 查詢嗎?Linq 到 NHibernate 怎麼樣?

謝謝你,安德烈

從 NHibernate v5 開始,現在完全支持非同步!

這裡有一些漂亮的例子:

Customer customer = await session.GetAsync<Customer>(1);

List<Customer> customers = await session.Query<Customer>().ToListAsync();

Customer customer = await session.Query<Customer>()
.Where(x => x.Name.Contains("Customer 1"))
.SingleOrDefaultAsync();

更新實體

using (ISession session = sessionFactory.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
   Customer customer = await session.GetAsync<Customer>(1);
   customer.Name = "Customer 3";
   await session.SaveOrUpdateAsync(customer);
   await transaction.CommitAsync();
}

文章來源

請注意,非同步數據庫呼叫本身並不意味著更好的整體可伸縮性。我推薦閱讀文章“我的數據庫呼叫應該是非同步的嗎? ”進行深入分析。這是那篇文章的引述:

一位受人尊敬的 DB/Web 架構師甚至說:

對於使用非同步操作來減少 Web 伺服器上阻塞執行緒數量的數據庫應用程序來說,幾乎總是完全浪費時間。一個小型 Web 伺服器可以輕鬆地處理比您的數據庫後端可以同時處理的更多的並發阻塞請求。相反,請確保您的服務呼叫在數據庫中很便宜,並將並發執行的請求數限制為您已經測試過的數量,以便正確工作並最大限度地提高整體事務吞吐量。

引用自:https://stackoverflow.com/questions/2485960