我正在开发作为Windows服务运行的应用程序。还有其他组件,包括一些WCF服务、一个客户机GUI等等,但访问数据库的是Windows服务。
因此,这个应用程序是一个长期运行的服务器,我想提高它的性能和可伸缩性,我希望改善数据访问等。我在另一篇关于二级缓存的帖子中发表了这篇文章。
这篇文章是关于访问数据库的长期运行线程的会话管理。我应该使用线程静态上下文吗?如果是这样的话,是否有任何例子说明如何实施。
网络上每一个使用NHibernate的人似乎都非常关注web应用程序风格的体系结构。对于非web应用程序的设计,似乎很缺乏文档/讨论。
目前,我长期运行的线程是这样做的:
因此,下面是我们为每个DAO方法使用的通用模式:
对DAO类的每个方法调用都会发生这种情况。我怀疑这是一种反模式,就像我们现在这样做。
然而,我在任何地方都找不到足够的方向来改进它。
请注意,当这个线程在后台运行时,会有来自WCF客户端的请求,每个请求都可以自己调用2-3个DAO --有时查询/更新长期运行的线程所处理的相同对象。
任何改进我们设计的想法、建议和建议都将不胜感激。如果我们能进行一些好的讨论,我们可以将它变成一个社区wiki,并从http://nhibernate.info链接到这里。
克里希纳
发布于 2008-10-05 08:45:23
对于非web应用程序的设计,似乎很缺乏文档/讨论。
这也是我的经验。然而,你所遵循的模式在我看来是正确的。您应该始终打开会话,提交更改,然后再次关闭它。
发布于 2011-03-03 14:25:03
这个问题现在有点老了,但另一种技术是使用上下文会话,而不是在每个DAO中创建一个新会话。
在我们的示例中,我们考虑每个线程创建一次会话(对于我们的多线程win32服务),并使用返回SessionFactory.GetCurrentSession()的属性(使用ThreadContext当前会话提供程序,所以它是每个线程的会话)或通过DI (依赖注入-再次使用ThreadContext)将其提供给DAO。
关于GetCurrentSession和上下文会话的更多信息。
发布于 2008-11-27 16:32:42
我同意,有状态应用程序的例子不多。我想做以下几件事:
和您一样,我有一个windows服务,托管了许多WCF服务。所以WCF服务是入口点。最终,我所有的WCF服务都继承了AbstractService --它处理大量日志记录和基本DB插入/更新。
在我见过的最好的NHibernate文章中,HttpModule做了以下工作:参见http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx
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在条目中(在异常发生后不要刷新会话)。
https://stackoverflow.com/questions/171699
复制相似问题