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