2009-02-18 110 views
7

嗨我正在一个项目,我们需要每天处理几个xml文件,并使用这些文件中包含的信息填充数据库。NHibernate批量插入或更新

每个文件大约为1Mb,包含大约1000条记录;我们通常需要处理这些文件中的12到25个。我已经看到关于使用NHibernate批量插入的一些信息,但是我们的问题在某种程度上更复杂,因为xml文件包含与更新记录混合的新记录。

在xml中有一个标志,告诉我们是一个特定的记录是一个新的还是现有记录的更新,但不是什么信息发生了变化。 xml记录不包含我们的数据库标识符,但我们可以使用xml记录中的标识符来唯一地定位我们数据库中的记录。

到目前为止,我们的策略是确定当前记录是插入还是更新,并基于该插入对数据库执行插入或我们执行搜索,然后使用来自xml记录的信息,最后我们会对数据库进行更新。

我们目前的方法存在的问题是,我们遇到了数据库锁的问题,而且我们的性能降低得非常快。我们已经考虑过一些替代方案,比如为不同的业务分开表格,甚至分开数据库,但做这样的举动意味着需要付出很大的努力,所以在做出任何决定之前,我要先征求社群的意见。

回答

17

一对夫妇的想法:

  • 始终尝试使用IStatelessSession进行批量操作。
  • 如果你还是不满意的表现,只是跳过NHibernate和使用特定于该存储过程或参数化查询,或者使用IQuery.ExecuteUpdate()
  • 如果您正在使用SQL Server,你可以在你的XML格式转换为BCPFORMAT xml然后在其上运行BULK INSERT(仅用于插入)
  • 如果您拥有太多的数据库锁,请尝试对操作进行分组(即首先找出需要插入的内容和更新内容,然后获取更新的PK ,然后运行BULK INSERT进行插入,然后运行更新)
  • 如果解析源文件是一个性能问题(即它最大化了一个CPU内核),请尝试并行执行(可以使用Parallel Extensions