大型连通图上的休眠 SaveOrUpdate

Posted

技术标签:

【中文标题】大型连通图上的休眠 SaveOrUpdate【英文标题】:Hibernate SaveOrUpdate on Large Connected Graph 【发布时间】:2012-03-26 13:26:23 【问题描述】:

我有一个大的相互关联的实体图(大约 1.2k)。尝试保存时,JVM 会抛出 ***Error(如下)。实体/orm 类仅在连接节点的顶点上使用保存/更新级联。在较小的图形大小上,级联工作正常,但在较大的大小上它会中断。有人可以建议一些文档或提供有关 Hibernate 可能存在的限制的任何见解吗?

依赖关系:

休眠 4.0.1 HyperSQL 2.2

例子:

-Node_1

----leaf_a => 节点_2

         ----leaf_c => node_4

----leaf_b => 节点_3

          ----leaf_d => node_5

JVM 错误:

java.lang.***Error 在 java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:768) 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.locateServiceBinding(AbstractServiceRegistryImpl.java:114) 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.locateServiceBinding(AbstractServiceRegistryImpl.java:109) 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:124) 在 org.hibernate.internal.SessionImpl.eventListenerGroup(SessionImpl.java:624) 在 org.hibernate.internal.SessionImpl.listeners(SessionImpl.java:620) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:614) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:608) 在 org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258) 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:132) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:335) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:239) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:615) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:608) 在 org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258) 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:409) 在 org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:350) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:326) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:132) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:335) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:239) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:615) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:608) 在 org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258) 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:132) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:335) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:239) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:615) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:608) 在 org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258) 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:409) 在 org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:350) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:326) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:132) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:335) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:239) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:615) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:608) 在 org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258) 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:409) 在 org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:350) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:326) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:132) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:335) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:239) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:615) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:608) 在 org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258) 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:132) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:335) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:239) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:615) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:608) 在 org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258) 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:409) 在 org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:350) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:326) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:132) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:335) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:239) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:615) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:608) 在 org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258) 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:409) 在 org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:350) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:326) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:132) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:335) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:239) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:615) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:608) 在 org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258) 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:132) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:335) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:239) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:615) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:608) 在 org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258) 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:409) 在 org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:350) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:326) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:132) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:335) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:239) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:615) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:608) 在 org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258) 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:409) 在 org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:350) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:326) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:132) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:335) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:239) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:615) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:608) 在 org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258) 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:132) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:335) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:239) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) 在

【问题讨论】:

【参考方案1】:

如果级联适用于较小的图形,在我看来,问题与递归持久堆栈太深并且堆栈溢出有关(堆栈溢出的最常见原因之一是不会终止的递归,但是如果你有一个真正合法的深度递归堆栈,也可能发生。

在此处查看答案:Stack overflows from deep recursion in Java? 所选答案提供了有关更改堆栈大小的详细信息,但如果您预计会有大量数据增长,那么我想您将需要考虑您的运行时环境要求以及它们将如何扩展。

-ss Stacksize to increase the native stack size or

-oss Stacksize to increase the Java stack size,

The default native stack size is 128k, with a minimum value of 1000 bytes. The default java stack size is 400k, with a minimum value of 1000 bytes.

【讨论】:

嘿 rhinds - 这绝对是一个合法的递归过程,因为它是由 Hibernate 在级联保存/更新操作期间执行的。我可以增加堆栈并且它可以工作,所以也许就这么简单。很想知道是否有其他人遇到过或遇到过任何相关信息。感谢您的链接。干杯,

以上是关于大型连通图上的休眠 SaveOrUpdate的主要内容,如果未能解决你的问题,请参考以下文章

并查集-判断图的连通

强连通分量的Tarjan算法

算法---图

「学习笔记」双连通分量割点与桥

[JSOI2015]最小表示

乱七八糟的图论1