我们的应用程序最初是使用 NHibernate 构建的,并考虑到其批处理的局限性。然而,随着时间的推移,它已经变成了一个数据处理机,我们观察到性能显着下降。
session 最终必须维护大约 1000 个或更多对象,我们的分析显示,自动刷新和脏检查是这里最大的问题。我们尝试关闭自动刷新并在保存/更新操作中自行管理它,但这导致批量保存/更新的灾难性性能。 我们现在正在研究从 session 中逐出不需要的对象的选项。
- 我遇到了二级缓存逐出方法(
sessionFactory.Evict(typeof(Cat));
),它允许我们按类型逐出,但我们不使用二级缓存。我还可以使用此方法从一级缓存中逐出对象吗? - 我还阅读了一种获取对象的模式,将它们从 session 中逐出,然后在需要时通过调用 Update() 将它们与 session 重新关联。这是推荐和接受的模式吗,因为我还读到 NH3 对此设置了围墙? (我们还可以使用它,因为我们还没有升级到NH3)
虽然我们意识到我们没有以最好的方式使用 NHibernate,但我们只是希望以某种方式改善当前的情况。非常感谢对上述问题的回答以及任何其他建议/推荐。谢谢。
更新
在查看 NH 文档和代码后,我意识到 1 可能是不可能的。我仍在寻找有关使用 Evict() 的一些指示或技巧。我能够大幅减少 session 中的对象数量。但仍然不知道更新或删除被逐出的对象是否需要付出代价。感谢您提前提供的帮助。
最佳答案
如果不了解更多有关您的要求的信息,很难说,但也许您可以使用 IStatelessSession。它没有需要担心的一级缓存。
Ayende 有一篇关于使用它进行批量操作的好文章 here
关于performance - session 中对象过多时提高 NHibernate 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5175657/