nHibernate数据插入问题/谜团

nHibernate数据插入问题/谜团,nhibernate,Nhibernate,我这里有个奇怪的。 我使用的是nhibernate,我的问题是在较大的数据插入上没有抛出异常,表中没有数据,但是标识键被占用了。所以当我手动插入下一条记录时,标识键会跳过几次,就好像数据被导入和删除一样 以下是一些需要考虑的事项: -我正在从web服务获取数据,因此每个项在调用makepersistent之前都需要一段时间 -根据项目的不同,它可以是插入或更新 -我正在使用foreach对获取的集合进行迭代,然后检查它是更新还是插入(即,我尝试填充一个实体或创建一个新实例,然后在最后调用make

我这里有个奇怪的。 我使用的是nhibernate,我的问题是在较大的数据插入上没有抛出异常,表中没有数据,但是标识键被占用了。所以当我手动插入下一条记录时,标识键会跳过几次,就好像数据被导入和删除一样

以下是一些需要考虑的事项: -我正在从web服务获取数据,因此每个项在调用makepersistent之前都需要一段时间 -根据项目的不同,它可以是插入或更新 -我正在使用foreach对获取的集合进行迭代,然后检查它是更新还是插入(即,我尝试填充一个实体或创建一个新实例,然后在最后调用make persistent) -代码的工作原理是,数据确实插入到较小的批中,并且在数据库中可见。对于需要稍长时间的导入,它仍然是完整的,没有任何异常,但没有可见的数据,但唯一的线索是标识键已被插入和可见的内容占用

有人能解释一下这是怎么回事吗?
由于我没有得到任何例外,我没有办法诊断,任何帮助或建议非常感谢

我一时想不出会发生什么事。你有SQL分析器吗?如果您这样做了,并且您可以在事件发生时运行探查器持续地重现此问题,那么应该可以提示您正在发生什么。如果没有,您可以编写insert/delete触发器来跟踪表中的情况。

您的PK生成策略是什么?(知道这一点可能有助于解释PKs被用完的原因。)在我的脑海中,听起来你的交易好像超时了。一些解决方法

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

    • 带有标识的主键和回滚事务可以解释丢失的键。它们被插入,然后又被删除,要么是因为后来的错误导致了回滚,要么是因为James建议的事务超时。对此进行了讨论


      你真正的问题似乎是无声的错误。您是否使用空捕获来抑制异常?您的捕获是否会抛出自己的异常?如果您还没有,我建议使用一个简单的文件追加器(sink)将log4net添加到您的项目中。NHibernate会将它所做的一切写在log4net上,如果它存在的话(对于调试很有用,但不要在生产中保持开启状态)。或者,如前所述,您可以分析SQL。

      谢谢您的回答,您的回答非常准确。批处理被包装在一个事务中,因此您对回滚的建议必须与实际情况完全一致。事实上,有一个异常是手动捕获的,是由于需要逐出实体以进行下一次更新/插入。感谢所有回应的人和你们所有的时间!