2010-11-17 83 views
0

我在这里有一个奇怪的。 我正在使用nhibernate,我的问题是,在较大的数据插入时,不会抛出任何异常,表中没有数据,但身份关键字已被占用。所以当我手动插入下一条记录时,身份密钥会跳过一些数据,就像数据被导入并删除一样?!?!nHibernate数据插入问题/神秘

这里有一些事情要考虑: - 我从Web服务获取数据,因此每个项目需要一段时间,它被调用之前再接再厉 - 根据它或者是插入或更新的项目 - 我使用foreach遍历获取的集合,然后检查它是否更新或插入(即,我尝试填充实体或创建新实例,然后在最后调用make persistent。) - 代码工作正常因为数据在较小的批次上插入并在数据库中可见。对于需要稍长一点的导入,它仍然没有任何例外地完成,但没有可见的数据,但只有线索是已被插入和可见的标识关键字占用。

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

回答

0

带IDENTITY的主键和回退事务将解释缺失的键。他们被插入然后再被移除,要么是因为稍后的错误导致了回滚,要么就像詹姆斯所说的那样,事务超时。这是讨论here

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

+0

谢谢你的回答,非常准确地回答。批处理被包装在单个事务中,所以你对回滚的建议必须正是发生的事情。 实际上有一个异常被手动捕获,并且是由于需要将实体驱逐出来才能进行下一次更新/插入。 非常感谢所有回复您的朋友! – Sid 2010-11-20 16:11:52

0

关闭我的头顶我无法想象会发生什么。你有SQL分析器吗?如果你这样做,并且你可以持续地重现运行探查器的这个问题,而它发生时应该知道发生了什么。如果没有,你可能会写入插入/删除触发器来跟踪表中发生的事情。

0

你的PK代战略是什么? (知道这可能有助于解释为什么PK已经用完了。)关闭我的头顶,听起来就像你的交易超时了。一些解决方法...

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