在旨在运行作业的 Windows Web 服务的上下文中,我们尝试重用我们为 Web 应用程序开发的 NHibernate DAL。
对于会话管理,我们有两种选择,每种都有其优点和缺点:
有状态的会话
- 因为它会跟踪所有内容(L1/会话缓存),所以会增长很多
- 需要小心关闭,会话处理似乎不足以清除 L1 缓存(我使用内存分析器注意到的)
无状态会话
- 目前无法重用映射。所有用“lazy=true”声明的包最终都会出现以下异常(即使会话尚未关闭):
Initializing [...] failed to lazyly initialize a collection of role: [...], no session or session was closed
显然,我们不能使用lazy="false" 更新映射(它们与网络应用程序共享),这将是性能的巨大缺陷
- 无法与 L2 缓存交互:当将部署共享 L2 缓存时,服务将无法使 L2 缓存数据无效,以便 Web 应用程序拥有最新的数据
到目前为止,NHibernate 已经被证明是好的,我们已经成功地在 web 上下文中使用了有状态会话和 NHibernate LINQ,以及用于依赖注入的结构图。
我的问题是:
- 在长时间运行的线程中使用 NHibernate 有什么好的解决方案吗?
- 我更喜欢使用有状态会话,但如何避免内存泄漏?