performance - 读取大包时 NHibernate 变慢

标签 performance nhibernate

我遇到了性能问题,其中聚合有一个包含大量实体(1000 多个)的包。通常它最多只包含 50 个实体,但有时会更多。

使用 NHibernate 分析器,我看到从数据库中获取这个包的 1123 条记录的持续时间是 18 毫秒,但 NHibernate 需要 1079 毫秒来处理它。这里的问题是所有这 1123 条记录都有一两个额外的记录。我使用 fetch="subselect"获取这些数据,获取这些附加记录需要 16 毫秒从数据库中获取,NHibernate 处理需要 2527 毫秒。所以仅这个 Action 就需要 3.5 秒,这太昂贵了。

我读到这是因为更新一级缓存是这里的问题,因为它在加载大量实体​​时性能变慢。但什么是很多? NHibernate Profiler 说我有 1145 个实体由 31 个查询加载(在我的例子中这是绝对最小值)。这个加载的实体数量对我来说似乎并不多。

在当前项目中我们使用的是 NHibernate v3.1.0.4000

最佳答案

我同意,1000 个实体并不算多。您确定其中一个构造函数或属性 setter 中没有使用时间吗?您可以在加载期间停止调试器,以在它花费时间的地方进行随机采样。

还要确保您使用了反射优化器(我认为它是默认打开的)。

我假设您测量查询本身的时间。如果您衡量整个交易,它肯定会花时间刷新 session 。通过将 FlushMode 设置为 Never(仅当要存储的 session 中没有任何更改时)或使用 StatelessSession 来避免刷新.

一个疯狂的猜测:删除批量大小设置甚至可能使其更快,因为它不需要将实体分配给相应的集合。

关于performance - 读取大包时 NHibernate 变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6647774/

相关文章:

c# - 使用 'do nothing' 默认事件处理程序是否存在任何性能缺陷?

html - 访问文件结构中数据的pythonic方式

nhibernate - 如何从 Nhibernate session 中获取已更改(脏)实体的列表?

java - Spring hibernate 模板 : how it deals with transactions?

.net - 我可以使用 NHibernate 作为与不同数据库引擎通信的标准化方式吗?

mysql - 许多单独的查询 v. 一个大的查询

python - 更多的标题困惑。为什么信号量这么慢?

java - 是否有 O(N) 解决方案来获取 List<String> 中出现次数最多的前 k 个字符串?

c# - NHibernate 多个带有 in 子句的子查询

.net - 使用 LINQ 进行多次删除(更具体地说是 Linq2Nhibernate,但是......)