7

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

每个文件大约 1Mb,包含大约 1000 条记录;我们通常需要处理 12 到 25 个这些文件。我已经看到了一些关于使用 NHibernate 进行批量插入的信息,但我们的问题有点棘手,因为 xml 文件包含混合了更新记录的新记录。

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

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

我们当前方法的问题是我们遇到了数据库锁问题,并且我们的性能下降得非常快。我们已经考虑过一些替代方案,例如为不同的操作设置单独的表,甚至是单独的数据库,但这样做意味着付出很大的努力,所以在做出任何决定之前,我想征求社区对此事的意见,在此先感谢。

4

2 回答 2

17

几个想法:

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

这可能会有所帮助:http: //ideas-net.blogspot.com/2009/03/nhibernate-update-performance-issue.html

于 2009-03-30T05:52:50.733 回答