hibernate - Grails:获取/解决 “Could not synchronize database state with session”吗?

标签 hibernate session grails

这个问题的根源是,什么原因会导致同步失败?这是一条通用消息,仅表示“出了点问题”,还是 session 本身确实有问题? 有几个具有相似标题的线程,但是似乎没有一个真正能解决休眠状态为何无法同步 session 的问题,这只是错误消息的一部分,人们已经忽略了它。

我的具体情况/细节(尽管与上述问题确实切合):

在数据导入(20-120分钟)期间,我正在做大量处理。直到整个域对象集都被构建并验证一致性之后,持久性才开始。在这段时间里,我在大约200,000个域对象上构建了某个地方。在该过程的最后,它将遍历所有对象,并将它们保存到数据库中,并(出于性能原因)每隔50或100个对象刷新/清除 session 一次。持久性开始后,域对象将不会更改。

这都是在单个服务调用,单个事务中发生的。我也无法在我的测试系统上重现这一点,它只是在生产中发生过。

我使用的是domainObj.save()而不是session.saveOrUpdate(domainObj),唯一一次手动触摸 session 的方法是在一组更新后刷新/清理它:

def session = sessionFactory.currentSession
session.flush()
session.clear()

这是引发异常的地方。

同步失败消息后立即出现(可能是结果,但可能与原因有关):
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

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

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

此时,我已经开始漫无目的的猜测了,我不想有人为我解决问题,但希望有人清楚地知道有关同步 session 的知识,而不是“您是否确定不插入重复的数据? ”因为我尽我所能确定(使用受约束的唯一字段作为查找要保存的域对象的键在Hashmap.keySet()上进行迭代)。

最佳答案

不幸的是,我仍然不知道如何实际调试“无法将数据库状态与 session 同步”,但是我最终能够解决此问题。

显然,数据库使用的Oracle表空间未设置为增长,并且已填满。一旦将表空间设置为“可扩展”,此错误就消失了。我非常怀疑这是否会帮助遇到相同问题的其他任何人,因为错误消息不适用,但是您永远不会知道。

关于hibernate - Grails:获取/解决 “Could not synchronize database state with session”吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12957329/

相关文章:

java - Spring Session 和 Redis 混合 session

grails - 如何从Grails中的自定义脚本运行Grails默认命令

iphone - apns服务问题

database - Java EE : running a database query in the background

java - Spring MVC 4.0 - Web Config 中的 Hibernate OpenSessioninViewFilter

php - 重新加载后页面变成空白

javascript - 如何在 onload 事件中接收 $_SESSION 变量作为参数

twitter-bootstrap - 使用超链接发送参数

java - 在服务器 hibernate 中部署时表不存在

java - 在 hibernate 中创建内部查询