performance - session 中对象过多时提高 NHibernate 性能

标签 performance nhibernate

我们的应用程序最初是使用 NHibernate 构建的,并考虑到其批处理的局限性。然而,随着时间的推移,它已经变成了一个数据处理机,我们观察到性能显着下降。

session 最终必须维护大约 1000 个或更多对象,我们的分析显示,自动刷新和脏检查是这里最大的问题。我们尝试关闭自动刷新并在保存/更新操作中自行管理它,但这导致批量保存/更新的灾难性性能。 我们现在正在研究从 session 中逐出不需要的对象的选项。

  1. 我遇到了二级缓存逐出方法(sessionFactory.Evict(typeof(Cat));),它允许我们按类型逐出,但我们不使用二级缓存。我还可以使用此方法从一级缓存中逐出对象吗?
  2. 我还阅读了一种获取对象的模式,将它们从 session 中逐出,然后在需要时通过调用 Update() 将它们与 session 重新关联。这是推荐和接受的模式吗,因为我还读到 NH3 对此设置了围墙? (我们还可以使用它,因为我们还没有升级到NH3)

虽然我们意识到我们没有以最好的方式使用 NHibernate,但我们只是希望以某种方式改善当前的情况。非常感谢对上述问题的回答以及任何其他建议/推荐。谢谢。

更新
在查看 NH 文档和代码后,我意识到 1 可能是不可能的。我仍在寻找有关使用 Evict() 的一些指示或技巧。我能够大幅减少 session 中的对象数量。但仍然不知道更新或删除被逐出的对象是否需要付出代价。感谢您提前提供的帮助。

最佳答案

如果不了解更多有关您的要求的信息,很难说,但也许您可以使用 IStatelessSession。它没有需要担心的一级缓存。

Ayende 有一篇关于使用它进行批量操作的好文章 here

关于performance - session 中对象过多时提高 NHibernate 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5175657/

相关文章:

nhibernate - DetachedCriteria和ICriteria有什么区别

performance - 只有一个参数函数有效吗? haskell

c++ - C/C++ 中 Memcopy 的性能成本

java - Android & OOP - fragment 中的全局变量与继承的 Getters

performance - Redis CPU 在排序集上的性能

wpf - 多次报告 log4net NHibernate.Util.ADOExceptionReporter

c# - NHibernate session.Query<ISomeInterface>().Count 返回错误的计数

c# - NHibernate ICriterion .NET 委托(delegate)不匹配

java - Java 和 Python 之间不可变字符串连接的性能比较

nhibernate - 为每个 ViewModel 创建一个 ISession 实例