我正在开发和作为Windows服务运行的应用程序.还有其他组件包括一些WCF服务,客户端GUI等 - 但它是访问数据库的Windows服务.
因此,该应用程序是一个长期运行的服务器,我想提高其性能和可伸缩性,我希望改善数据访问等.我发布了另一个关于二级缓存的帖子.
这篇文章是关于访问数据库的长期运行线程的会话管理.我应该使用线程静态上下文吗?如果是这样,是否有任何关于如何实施的例子.
网络上每个使用NHibernate的人似乎都非常关注Web应用程序风格的体系结构.对于非Web应用程序设计,似乎缺乏文档/讨论.
目前,我的长期运行线程执行此操作:
调用3或4个DAO方法
验证返回的分离对象的状态.
如果需要,更新状态.
调用几个DAO方法来持久化更新的实例.(传入对象的id和实例本身 - DAO将再次从DB中检索对象,并在提交事务之前设置更新的值和session.SaveOrUpdate().
睡觉'n'秒
重复一遍!
因此,以下是我们为每个DAO方法使用的常见模式:
使用sessionFactory.OpenSession()打开会话
开始交易
db工作.检索/更新等
提交trans
(例外情况下的回滚)
最后总是处理事务和session.Close()
对于DAO类的每个方法调用都会发生这种情况.我怀疑这是我们这样做的某种反模式.
但是,我无法在任何地方找到足够的方向来改进它.
请注意,虽然这个线程在后台运行,做其中的东西,有来自WCF客户端的请求,每个客户端可以自己进行2-3个DAO调用 - 有时查询/更新长时间运行的线程处理的相同对象.
任何有关改进我们设计的想法/建议/指示将不胜感激.如果我们能够进行一些很好的讨论,我们可以将它作为一个社区维基,并可能从http://nhibernate.info链接到这里
克里希纳
对于非Web应用程序设计,似乎缺乏文档/讨论.
这也是我的经历.但是,您所关注的模型对我来说似乎是正确的.您应该始终打开会话,提交更改,然后再次关闭它.