2013-01-12 36 views
1

我試圖按照這裏的博客帖子:http://www.philliphaydon.com/2012/06/using-nhibernate-with-servicestack/,雖然我遇到了我的代碼問題。基本上,我設置SessionFactory就像Phillip一樣,我的服務看起來與Phillip完全相同。ServiceStack&NHibernate集成創建兩個會話?

我遇到的問題是,當試圖從數據庫中抓取數據而沒有通過該函數 - 它看起來像會話在它被訪問之前被殺死,然後代碼似乎只是簡單地分解:

NHProf ServiceStack Issues http://i.stack.imgur.com/hw1jW.png

奇怪的是,當我嘗試調試通過其步進的功能,我回到我的成績很好,NHProf同意:

NH Prof ServiceStack Issues2 http://i.stack.imgur.com/DfNSi.png

有點奇怪,如果有人有任何答案,爲什麼發生這將不勝感激!

+0

看了這更多後,看起來像是如果我不處理這個問題,這個問題不會發生。顯然這不是最好的解決方案! – slashp

+0

我也對此感興趣,因爲我遵循相同的示例。 – OutOFTouch

+1

我把這個例子拷貝過來併爲一個簡單的select查詢創建了我自己的簡單模型,我可以在我的FindService中看到初始結果是正在獲取數據並正確映射到模型,但是當這個塊運行後,結果返回給我消費者爲空。返回新的ProductFindResponse { 結果= result.TranslateTo <ProductFindResponse.Product>() }; – OutOFTouch

回答

3

如果您將會話置於EndRequest上,會發生什麼情況?這應該允許您在進行數據庫調用時不必擔心會丟掉會話。

我用下面的在我的web.config允許我FluentSessionManager.cs內連接到Init事件:

<httpModules> 
     <add name="MyFramework.FluentSessionManager" type="MyFramework.FluentSessionManager" /> 
</httpModules> 

在我的FluentSessionManager.cs是住在命名空間MyFramework:

public void Init(HttpApplication context) 
    { 
     context.EndRequest += Application_EndRequest; 
    } 

public static void Application_EndRequest() 
    { 
     // Perform the disposing of your session here. Commit, close, etc.... 
    } 

這應該允許您在EndRequest事件中關閉並處理會話。這也可以防止你的內存泄漏和殭屍連接到你的SQL服務器。

希望這會有所幫助。

+0

這似乎工作!我一直擔心會話和Web請求的一件事是併發。例如,我仍然在我的Get方法中打開會話,並在我的最終請求中使用NHSessionFactory.GetCurrentSession(),然後關閉該會話。如果兩個請求同時發生並打開兩個單獨的會話,會發生什麼情況?或者,如果nHibernate在使用它的另一個請求的中間關閉會話,是什麼(如果我們只獲得當前會話並在所有請求中重用它)? – slashp

+1

這樣想想吧。訪問者a和訪問者b獲得完全不同的會話,這些會話是唯一綁定的會話。此外,即使您在同一時間有10個併發請求,但是從頁面向服務器發出請求時,每個請求都是唯一的。因此會使用完全不同的會話。你正試圖從整體角度來看待它。這不是它的工作原理。你需要從請求的角度來看待它。只需要擔心一次請求。服務器將所有併發請求分類。希望這可以幫助你放心。 –

+0

要完全回答你關於2個請求同時發生時會發生什麼的問題,那就是他們將獲得彼此獨立的單獨會話。一個請求不會影響其他請求。 –