【发布时间】:2012-10-10 10:17:36
【问题描述】:
在旨在运行作业的 Windows Web 服务的上下文中,我们尝试重用我们为 Web 应用程序开发的 NHibernate DAL。
对于会话管理,我们有两种选择,每种都有其优点和缺点:
有状态会话
- 随着它跟踪所有内容(L1/会话缓存)会大幅增长
- 需要小心关闭,会话处理似乎不足以清除 L1 缓存(我使用内存分析器注意到的)
无状态会话
- 目前无法重用映射。所有声明为“lazy=true”的包最终都会出现以下异常(即使会话尚未关闭):
Initializing [...] 未能延迟初始化角色集合: [...],没有会话或会话已关闭
显然,我们不能使用lazy="false" 更新映射(它们与网络应用共享),这将是性能的一个巨大缺陷
- 无法与 L2 缓存交互:部署共享 L2 缓存时,服务将无法使 L2 缓存数据失效,以便 Web 应用程序拥有最新的数据
到目前为止,NHibernate 已经被证明是不错的,我们已经成功地在 Web 上下文中使用了有状态会话和 NHibernate LINQ,并带有用于依赖注入的结构图。
我的问题是:
- 有没有什么好的解决方案可以在长时间运行的线程中使用 NHibernate?
- 我更喜欢使用有状态会话,但是如何避免内存泄漏?
【问题讨论】:
标签: nhibernate .net-4.0 windows-services structuremap istatelesssession