nHibernate数据插入问题/谜

时间:2010-11-17 03:08:32

标签: nhibernate

我在这里有一个奇怪的。 我正在使用nhibernate,我的问题是在较大的数据插入时没有抛出异常,表中没有数据,但是身份密钥被占用。因此,当我手动插入下一条记录时,身份密钥会跳过一些,就像导入和删除数据一样?!?!

以下是需要考虑的事项: - 我从Web服务中获取数据,因此每个项目都需要一段时间才能被称为make persistent - 根据项目,它可以是插入或更新 - 我正在使用foreach遍历获取的集合,然后检查它是否更新或插入(即我尝试填充实体或创建新实例,然后在最后调用make persistent。) - 代码的工作原理是数据插入较小的批次并在数据库中可见。对于需要稍长时间的导入,它仍然完整,没有任何例外,但没有数据可见,但只有线索是身份密钥已被插入和可见的内容占用。

任何人都可以解释这里发生了什么吗? 由于我没有得到任何例外,我无法诊断这一点,任何帮助或建议都非常感谢!

3 个答案:

答案 0 :(得分:0)

我无法想到可能发生的事情。你有SQL分析器吗?如果你这样做,你可以一直重现这个问题,在它发生时运行探查器应该让你知道发生了什么。如果没有,您可以编写插入/删除触发器来跟踪表中发生的事情。

答案 1 :(得分:0)

你的PK生成策略是什么? (知道这可能有助于解释为什么PK被用完了。)在我的头顶,听起来你的交易超时了。一些方法...

  • 假设您的数据库提供程序支持,通过hibernate.cfg.xml中的adonet.batch_size启用更新批处理。 SQL Server和Oracle提供商肯定会这样做。许多其他人没有。
  • 从您获取Web服务中的所有数据,并且在拥有所有数据之前不要开始插入/更新对象。这将有助于缩短您的数据库事务,因为您不会等待Web服务。
  • 如果您的业务逻辑允许,请考虑将一个较大的批次拆分为多个较小的批次。由于较小的批次正在运行,因此提交您的交易并在每个X项目中开始新的交易可能是有意义的。

答案 2 :(得分:0)

具有IDENTITY的主键和回滚事务将解释缺少的键。它们被插入然后再次删除,因为后来的错误导致了回滚,或者事务超时,正如詹姆斯建议的那样。这是讨论here

你真正的问题似乎是无声的错误。你是否用空捕获来压制异常?你的捕获物可以抛出它自己的例外吗?如果您还没有,我建议使用简单的文件追加器(接收器)将log4net添加到您的项目中。如果它存在的话,NHibernate写出它对log4net所做的一切(对于调试很有用,但不要在生产中保留它)。或者,如已经建议的那样,您可以分析您的SQL。