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