Nhibernate大型事务,刷新vs锁

时间:2013-11-17 19:15:08

标签: c# sql-server nhibernate

我正面临着使用Nhibernate维护令人难以置信的大型事务的挑战。所以,让我们说,我正在节省大量实体。如果我不刷新交易 N ,让我们说10000,那么由于过度拥挤的Nh Session会导致性能下降。如果我进行刷新,我将锁定放在DB级别,这与读取提交的隔离级别相结合会影响工作应用程序。还要注意,实际上我导入了一个实体,其业务逻辑是系统的核心之一,并且导入大约10个表会受到影响。由于手动维护级联,这使得无状态会话成为一个坏主意。

由于原因,将BL移至存储过程是一项重大挑战:

  1. 域中已经存在复杂的OO业务逻辑 应用程序类,
  2. 将引入重复的BL。
  3. 理想情况下,我想将Flush会话转换为某个文件,然后才完成数据准备,我想执行其内容。有可能吗?

    欢迎任何其他建议/最佳做法。

1 个答案:

答案 0 :(得分:1)

您的方案是典型的ORM批处理问题。一般来说,我们可以说没有ORM可以用于那样的东西。如果您希望具有较高的批处理性能(不是永久锁定和死锁),则不应使用ORM插入1000条记录。

而是使用本机批量插入,这将永远快得多。 (如MMSQL的SqlBulkCopy

无论如何,如果你想使用nhibernate,请尝试使用批量大小设置。 呼叫保存或更新所有对象,最后只调用session.Flush一次。这将在内存中创建所有对象......

根据批量大小,nhibernate应该尝试创建具有此大小的插入/更新批次,这意味着您将减少很少的数据库往返次数,因此锁定次数会减少或至少不会花费那么长时间...... < / p>

通常,如果使用正常事务,则只有在服务器上执行第一个插入语句时,您的操作才应锁定数据库。如果您使用TransactionScope,它可能会有所不同。

以下是一些有关如何改进批处理的附加说明。

http://fabiomaulo.blogspot.de/2011/03/nhibernate-32-batching-improvement.html NHibernate performance insert http://zvolkov.com/clog/2010/07/16?s=Insert+or+Update+records+in+bulk+with+NHibernate+batching

相关问题