2015-08-21 23 views
1

我打電話跟PARAM程序這種方式(通過使用NHibernate會話):如何在NHibernate會話中啓用多線程?

var session = (NHibernate.ISession)GetConnection("BookDataBase");//NHibernate.ISession 
var query = session.CreateSQLQuery("exec UpdateBook @BookId=:bookid"); 
query.SetInt32("bookid", bookId); 
query.ExecuteUpdate(); 

this question經過多次調查,據我瞭解,NHibernate.ISession提到是會話的每個請求。所以,因爲有時我試圖同時運行2個程序,先正常工作,但

交易第二個失敗未連接,或者斷開連接

所以我需要以某種方式實現多任務的Isession ,或者至少可以同時執行運行程序。

我該如何做到這一點? (我發現的大多數鏈接都說明了這種情況正在發生,但它沒有幫助解決它)。

回答

2

會話上下文根據您的配置,可能在您的DI容器(如果您使用任何)或自己的包裝類中確定;所以如果它不在你的DI控制器中,那麼你可能應該按照你在問題GetConnection(String databaseName)中提到的函數的代碼,你應該能夠弄清楚什麼是會話上下文。

會話上下文可以是'Per-request','Per-thread'或甚至是應用程序範圍內的單例(當然不推薦)。

現在回答你的問題,我不能確定,只有你提供的信息,如果你應該繼續在多個線程上使用相同的會話對象(如果你現在是這種情況),但我建議你在線程上僅使用會話每線程上下文,並使用通過UI或API傳遞的不需要很長處理時間的按會話請求的上下文服務請求,這樣您就可以充分利用會話中的使用在這兩種情況下,

0

在這種情況下,你應該使用SessionFactory對象,像

ISessionFactory sessionFactory = //get the factory 
using (session = sessionFactory.OpenSession()) 
using (tx = session.BeginTransaction()) 
{ 
    var query = session.CreateSQLQuery("exec UpdateBook @BookId=:bookid"); 
    query.SetInt32("bookid", bookId); 
    query.ExecuteUpdate(); 
    tx.Commit(); 
} 

有很多方法來實現這一目標,這取決於你的應用程序。例如,如果它是一個Web應用程序,您可以爲每個請求創建會話。