2013-01-12 37 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个请求同时发生时会发生什么的问题,那就是他们将获得彼此独立的单独会话。一个请求不会影响其他请求。 –