C# Nhibernate 保存列表

Fel*_*ago 3 c# sql-server nhibernate

今天我有一个包含 40.000 个寄存器的列表,我需要将其保存在我的 MSSQL 数据库中。当我试图保存它时,我检查了我的控制台显示,我意识到它正在逐项保存,这消耗了很多时间,即使我试图用下面的命令插入整个列表。

List<Andamento> andamentoList = fillAndamentoList(parameters);
_repository.Save(andamentoList);
_repository.Commit();
Run Code Online (Sandbox Code Playgroud)

是否可以配置 NHibernate 并将其更改为仅通过一个数据库交互来实际插入整个列表?

非常感谢,

Naj*_*era 5

要使用 NHibernate 进行批处理,您需要使用无状态会话:

using (var statelessSession = sessionFactory.OpenStatelessSession())
using (var transaction = statelessSession.BeginTransaction())
{
    foreach (var item in andamentoList)
    {
        statelessSession.Insert(item);
    } 
    transaction.Commit();
}
Run Code Online (Sandbox Code Playgroud)

将此与批处理大小相结合以在您的配置文件中获得性能:

<property name="adonet.batch_size">100</property>
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读更多内容。


小智 0

首先要事。如果您不启动显式事务,NHibernate 将为您保存/刷新的每一项启动隐式事务。开始交易的成本很高。所以你需要做的第一件事是

using (var transaction = session.BeginTransaction())
{
   //Loop here
   transaction.Commit();
}
Run Code Online (Sandbox Code Playgroud)

另一件需要注意的事情是需要多少条语句来保存一个实体。如果它不止一个,您必须创建自己的批处理程序(内置的批处理程序无法很好地处理每类表和其他情况)。