Hibernate Grails:获取/解决“问题”;无法将数据库状态与会话“同步”;?

Hibernate Grails:获取/解决“问题”;无法将数据库状态与会话“同步”;?,hibernate,session,grails,Hibernate,Session,Grails,这个问题的根源是,什么会导致同步失败?这是一条仅仅意味着“出了问题”的通用消息,还是会话本身确实有问题有一些线程具有类似的标题,但似乎没有一个线程真正解决hibernate无法同步会话的原因,这只是错误消息的一部分,被人们忽略了 我的具体案例/细节(尽管这与上述问题非常相切): 在数据导入期间(20-120分钟),我要做大量的处理。在构建整个域对象集并验证其一致性之前,持久性不会开始。在这段时间里,我构建了大约200000个域对象。在该过程结束时,它会在所有对象之间循环,并将它们保存到数据库中,

这个问题的根源是,什么会导致同步失败?这是一条仅仅意味着“出了问题”的通用消息,还是会话本身确实有问题有一些线程具有类似的标题,但似乎没有一个线程真正解决hibernate无法同步会话的原因,这只是错误消息的一部分,被人们忽略了

我的具体案例/细节(尽管这与上述问题非常相切):

在数据导入期间(20-120分钟),我要做大量的处理。在构建整个域对象集并验证其一致性之前,持久性不会开始。在这段时间里,我构建了大约200000个域对象。在该过程结束时,它会在所有对象之间循环,并将它们保存到数据库中,并且(出于性能原因)在每50或100个对象之后刷新/清除会话。一旦持久性开始,域对象就不会更改

这一切都发生在单个服务调用、单个事务中。我也不能在我的测试系统上复制它,它只发生在生产中

我使用的是
domainObj.save()
,而不是
session.saveOrUpdate(domainObj)
,我手动触摸会话的唯一时间是在一组更新后刷新/清理会话:

def session = sessionFactory.currentSession
session.flush()
session.clear()
这是引发异常的地方

紧接着同步失败消息的是(可能是结果,但可能与原因有关):

我意识到这个ConstraintViolation(是的,“constraint”不是“constraint”)似乎是一个数据错误,但是数据集一直在工作,并且在没有更改导入文件或代码的情况下,开始抛出这个错误。它还可以在其他系统上继续工作,所以我已经在一定程度上排除了数据错误

我几乎可以肯定,由于对象关系的性质,相同的对象被多次保存。这是提高性能的另一个地方,但我认为这是不相关的,因为一旦对象被保存,它应该被分配它的ID,并且被重新保存不应该导致错误


在这一点上,我已经偏离了闲谈和猜测的话题,我不希望有人帮我解决问题,但希望有人明确知道有关同步会话的内容,而不是“您是否确保没有插入重复数据?”因为我尽可能地确定(在Hashmap.keySet()上迭代)使用受约束的唯一字段作为键来查找要保存的域对象。

不幸的是,我仍然不知道如何实际调试“无法将数据库状态与会话同步”,但我最终解决了这个问题

显然,数据库使用的Oracle表空间没有增长,而且已经填满了。一旦表空间被设置为“可扩展”,这个错误就消失了。我非常怀疑这会帮助其他遇到同样问题的人,因为错误消息不适用,但是,你永远不知道

Could not execute JDBC batch update; SQL [insert into domainB(field1, field2, etc) values (?, ?, ?)];  
nested exception is org.hibernate.exception.ConstrainViolationException: Could not execute JDBC batch update