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

Kri*_*hna 12 nhibernate

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

因此,该应用程序是一个长期运行的服务器,我想提高其性能和可伸缩性,我希望改善数据访问等.我发布了另一个关于二级缓存的帖子.

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

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

目前,我的长期运行线程执行此操作:

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

因此,以下是我们为每个DAO方法使用的常见模式:

  • 使用sessionFactory.OpenSession()打开会话
  • 开始交易
  • db工作.检索/更新等
  • 提交trans
  • (例外情况下的回滚)
  • 最后总是处理事务和session.Close()

对于DAO类的每个方法调用都会发生这种情况.我怀疑这是我们这样做的某种反模式.

但是,我无法在任何地方找到足够的方向来改进它.

请注意,虽然这个线程在后台运行,做其中的东西,有来自WCF客户端的请求,每个客户端可以自己进行2-3个DAO调用 - 有时查询/更新长时间运行的线程处理的相同对象.

任何有关改进我们设计的想法/建议/指示将不胜感激.如果我们能够进行一些很好的讨论,我们可以将它作为一个社区维基,并可能从http://nhibernate.info链接到这里

克里希纳

ste*_*enj 7

对于非Web应用程序设计,似乎缺乏文档/讨论.

这也是我的经历.但是,您所关注的模型对我来说似乎是正确的.您应该始终打开会话,提交更改,然后再次关闭它.