4

这似乎是一个很常见的问题:我加载了一个 NHibernate 对象,该对象具有一个延迟加载的集合。稍后,我访问该集合以做某事。我仍然打开 nhibernate 会话(因为它是按视图或其他方式管理的),所以它确实有效,但事务已关闭,所以在 NHprof 中我得到“不鼓励使用隐式事务”。

我理解这条消息,并且由于我使用的是工作单元实现,我可以通过创建一个新事务并将对延迟加载集合的调用包装在其中来修复它。

我的问题是这感觉不对……我有一个很棒的 NHibernate 框架,它给了我很好的延迟加载,但是如果不将每个属性访问都包装在事务中,我就无法使用它。

我在谷歌上搜索了很多,阅读了大量的博客文章、关于 SO 的问题等,但似乎找不到完整的解决方案。

这是我考虑过的:

  1. 关闭延迟加载。我认为这很愚蠢,就像开满了跑车,然后只在生态模式下驾驶它。急切地加载所有内容会损害性能,如果我只有 id 而不是引用,那么为什么还要打扰 Nhibernate?
  2. 让交易保持更长时间。事务不应该长期存在,只要视图打开就保持打开状态只会自找麻烦。
  3. 将每个延迟加载属性访问包装在事务中。有效,但臃肿且容易出错。(即,如果我忘记包装访问器,那么它仍然可以正常工作。只有使用 NHProf 会告诉我问题)
  4. 加载初始对象时,始终加载我可能需要的属性的所有数据。同样,这很容易出错,无论是加载您不需要的数据(因为稍后访问它的调用已在某些时候被删除)或不加载您所做的数据

那么有没有更好的方法呢?任何帮助/想法表示赞赏。

4

1 回答 1

0

当我第一次在 NHProf 中遇到这个警告时,我也有同样的感受。在 Web 应用程序中,我认为最流行的方式是在整个请求期间打开事务(和工作单元)。对于桌面应用程序来说,管理事务(以及会话)可能会很痛苦。您可以使用自动事务管理框架(例如 Castle)并使用属性声明应该在事务中运行的服务方法。使用这种方法,您可以根据您的要求将多个操作包装到单个事务中。此外,我使用的是按视图打开会话的方法,每个视图打开一个会话并进行手动事务管理(在这种情况下,我只是忽略了有关隐式事务的分析器警告)。至于你的考虑:我强烈不推荐2)和3)。1) 和 4) 是要考虑的要点。

于 2012-09-13T12:07:55.110 回答