【问题标题】:nHibernate Data Insert Problem / MysterynHibernate 数据插入问题/谜团
【发布时间】:2010-11-18 05:43:20
【问题描述】:

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

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

谁能解释这里发生了什么? 由于我没有遇到任何异常,因此我无法诊断此问题,非常感谢任何帮助或建议!

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    带有 IDENTITY 的主键和回滚事务可以解释丢失的键。它们被插入然后再次删除,或者是因为后来的错误导致回滚,或者事务超时,正如 James 所建议的那样。这是讨论here

    您真正的问题似乎是静默错误。您是否使用空捕获来抑制异常?你的catch会抛出它自己的异常吗?如果您还没有,我建议您使用简单的文件附加程序(接收器)将 log4net 添加到您的项目中。 NHibernate 将它所做的所有事情都写到 log4net 中(如果它存在)(对调试很有用,但不要在生产中保留它)。或者,正如已经建议的那样,您可以分析您的 SQL。

    【讨论】:

    • 感谢您的回答非常准确。该批次被包装在一个事务中,因此您对回滚的建议必须正是正在发生的事情。实际上存在一个手动捕获的异常,这是由于需要驱逐实体才能进行下一次更新/插入。感谢所有回复的人和您所有的时间!
    【解决方案2】:

    我无法想象会发生什么。你有 SQL 探查器吗?如果你这样做了,并且你可以在运行分析器时始终如一地重现这个问题,那么它应该会让你了解正在发生的事情。如果没有,您可以编写插入/删除触发器来跟踪表中发生的情况。

    【讨论】:

      【解决方案3】:

      您的 PK 生成策略是什么? (知道这可能有助于解释为什么 PK 被用完。)在我脑海中,听起来您的交易正在超时。解决这个问题的一些方法...

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        • 2020-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多