gpt4 book ai didi

c# - NHibernate 和 Firebird 的性能问题

转载 作者:太空宇宙 更新时间:2023-11-03 13:55:37 27 4
gpt4 key购买 nike

我遇到了 NHibernate 3.3 和 Firebird 2.5.1 的性能问题。我使用 ASP.NET MVC 和本地 (!) Firebird 数据库创建了一个非常简单的示例。但是执行以下代码大约需要 1 秒?!?

        var startTickCountWrite = Environment.TickCount;

IRepository<Project> repository = facade.ProjectRepository(null);
for (int i = 1; i <= 250; ++i)
{
var myProject = new Project { ProjectId = i };
repository.Insert(myProject);
}
repository.Commit();

var endTickCountWrite = Environment.TickCount;

如果我将 commit() 放在 for 循环中,大约需要 5 秒!

Repository 和 facade 的背后没有什么特别的。我只是将项目转发给 ISession.Insert。

Project 只有 ID 和 ProjectID 作为属性。

谁能告诉我哪里出了问题?

谢谢,安德烈亚斯

最佳答案

1 秒内处理 250 个对象听起来并不慢。为了评估性能,最好提供一些比较 - 直接针对 Firebird 执行相同数量的 SQL 需要多长时间?

NHibernate 在某些情况下可以批处理 INSERT 语句,但我不知道这是否适用于 Firebird。 http://nhibernate.info/doc/nh/en/index.html#performance-batch-updates身份生成器的选择也会产生影响。一些生成器强制 NHibernate 立即执行 INSERT 语句,这将阻止批处理的使用。

从设计的角度来看,您可能想要更改一些内容:IRepository.Insert() 通常命名为 Add(),因为它模仿集合接口(interface)(并且集合上的 Insert,如果存在,通常采用此处不相关的索引参数)。此外,Commit() 在存储库中似乎不合适,因为您通常会涉及多个存储库实例,它们共享相同的事务和 session 。

要进行准确的时间测量,您可以使用 System.Diagnostics 中的秒表,因此您无需自行转换该值。

关于c# - NHibernate 和 Firebird 的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12301618/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com