首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows应用程序中的NHibernate会话管理

Windows应用程序中的NHibernate会话管理
EN

Stack Overflow用户
提问于 2008-10-05 08:33:02
回答 5查看 6.2K关注 0票数 12

我正在开发作为Windows服务运行的应用程序。还有其他组件,包括一些WCF服务、一个客户机GUI等等,但访问数据库的是Windows服务。

因此,这个应用程序是一个长期运行的服务器,我想提高它的性能和可伸缩性,我希望改善数据访问等。我在另一篇关于二级缓存的帖子中发表了这篇文章。

这篇文章是关于访问数据库的长期运行线程的会话管理。我应该使用线程静态上下文吗?如果是这样的话,是否有任何例子说明如何实施。

网络上每一个使用NHibernate的人似乎都非常关注web应用程序风格的体系结构。对于非web应用程序的设计,似乎很缺乏文档/讨论。

目前,我长期运行的线程是这样做的:

  1. 调用3或4 DAO方法
  2. 验证所返回的分离对象的状态。
  3. 如果需要,请更新状态。
  4. 调用几个DAO方法来持久化更新的实例。(传入对象的id和实例本身- DAO将再次从DB检索对象,并在提交事务之前设置更新的值和session.SaveOrUpdate()。
  5. 睡几秒钟
  6. 再重复一遍!

因此,下面是我们为每个DAO方法使用的通用模式:

  • 使用sessionFactory.OpenSession()打开会话
  • 开始交易
  • 做数据库工作。检索/更新等
  • 提交反式
  • (出现异常时回滚)
  • 最后,始终释放事务和session.Close()

对DAO类的每个方法调用都会发生这种情况。我怀疑这是一种反模式,就像我们现在这样做。

然而,我在任何地方都找不到足够的方向来改进它。

请注意,当这个线程在后台运行时,会有来自WCF客户端的请求,每个请求都可以自己调用2-3个DAO --有时查询/更新长期运行的线程所处理的相同对象。

任何改进我们设计的想法、建议和建议都将不胜感激。如果我们能进行一些好的讨论,我们可以将它变成一个社区wiki,并从http://nhibernate.info链接到这里。

克里希纳

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-10-05 08:45:23

对于非web应用程序的设计,似乎很缺乏文档/讨论。

这也是我的经验。然而,你所遵循的模式在我看来是正确的。您应该始终打开会话,提交更改,然后再次关闭它。

票数 7
EN

Stack Overflow用户

发布于 2011-03-03 14:25:03

这个问题现在有点老了,但另一种技术是使用上下文会话,而不是在每个DAO中创建一个新会话。

在我们的示例中,我们考虑每个线程创建一次会话(对于我们的多线程win32服务),并使用返回SessionFactory.GetCurrentSession()的属性(使用ThreadContext当前会话提供程序,所以它是每个线程的会话)或通过DI (依赖注入-再次使用ThreadContext)将其提供给DAO。

关于GetCurrentSession和上下文会话的更多信息

票数 1
EN

Stack Overflow用户

发布于 2008-11-27 16:32:42

我同意,有状态应用程序的例子不多。我想做以下几件事:

和您一样,我有一个windows服务,托管了许多WCF服务。所以WCF服务是入口点。最终,我所有的WCF服务都继承了AbstractService --它处理大量日志记录和基本DB插入/更新。

在我见过的最好的NHibernate文章中,HttpModule做了以下工作:参见http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx

代码语言:javascript
复制
private void BeginTransaction(object sender, EventArgs e) {
    NHibernateSessionManager.Instance.BeginTransaction();
}
private void CommitAndCloseSession(object sender, EventArgs e) {
    try {
        NHibernateSessionManager.Instance.CommitTransaction();
    }
    finally {
        NHibernateSessionManager.Instance.CloseSession();
    }
}

因此,也许我应该在AbstractService中做一些类似的事情。因此,实际上,每次服务调用都会有一个会话。如果您查看上面的NHib最佳实践文章链接,您将看到,只要我打开和关闭会话(AbstractService构造函数和析构函数),NHibernateSessionManager就应该处理其他所有事情。

这只是个想法。但是我遇到了错误,因为我的会话似乎停留太久了,而且我得到了臭名昭著的错误-- NHibernate.AssertionFailure: null id在条目中(在异常发生后不要刷新会话)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/171699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档