在主线程通过hibernate的find查询到数据后,把list里数据分别加入到新的list中,然后给子线程处理,子线程在执行getHibernateTemplate().delete(o)的时候,就可能会出现org.hibernate.StaleStateException。
我觉得这个异常出现的原因和内存回收有关系,在内存回收的时候。在session关闭的时候,这些数据会变成游离态,如果JAVA虚拟机没有进行垃圾回收的话,在执行delete操作时是没问题的。如果内存不够,或者有频繁的其他操作影响垃圾回收了,那在执行delete操作时就会出现这个问题。
另外,如果直接通过new一个object,生成主键之类的数据,直接delete数据,基本上也会出现这个问题。
解决的方法可以是:在每次的delete之前,先根据主键进行查询操作,如果不为null,再进行delete操作。
另外,直接通过sql进行delete操作应该也可以。update,save等操作应该也是同一个问题。
另外欢迎大家提其他的解决方案。
Hibernate: delete from PA_THIRDLOG where streamNumber=?
Hibernate: delete from PA_THIRDLOG where streamNumber=?
ERROR - Could not synchronize database state with session
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:24)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2525)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2702)
at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:77)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:420)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:846)
at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:842)
ERROR - Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException:
Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count:
0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0;
expected: 1
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:672)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:846)
at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:842)
分享到:
相关推荐
Hibernate 使用缓存时,数据同步问题
很多人都对Java在批量数据的处理方面是否是其合适的场所持有怀疑的念头,由此延伸,...下面以Hibernate为例来做为说明,假如我们真的不得不在Java中使用Hibernate来对数据进行批量处理的话。 向数据库插入100 000条数据
hibernate数据源 详解
这是Hibernate 的一个小的例子 数据持久化得初步。
◎ 数据持久化的概念 ◎ ORM的基本概念,POJO,PO的概念以及JDO的实现机制 ◎ Hibernate的实现机制 ◎ Hibernate的开发过程:如何配置数据库连接,如何操作数据库
java服务器端hibernate文件的各种数据源配置,有mySql,oracle,sqlServer等
Hibernate数据关联技术笔记Hibernate数据关联技术笔记Hibernate数据关联技术笔记Hibernate数据关联技术笔记Hibernate数据关联技术笔记
讲解myeclispe中详细的配置hibernate,里面有步骤1,2,
一个hibernate数据源的c3p0配置,希望对你有帮助
Hibernate数据类型映射表,介绍hibernate中各类型数据的关系!
Hibernate中数据类型,涵盖了所有数据库的字段类型与Java基本类型间的映射关系
hibernate入门数据简单插入
关于Hibernate的基本数据类型与Java中基本数据类型的映射关系
Hibernate 数据类型
Hibernate是一种Java语言下的对象关系映射解决方案。 它是使用GNU宽通用公共许可证发行的自由...它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。无论是从设计草案还是从一个遗留数据库开
spring boot 2多数据源,里面有hibernate和mybatis的多数据源代码。代码拿过去即可集成使用。
魔乐科技,李兴华老师的Hibernate教程笔记,对Hibernate的基础知识进行了比较详细的讲解,对初学者有一个比较笼统的介绍,是带我们入门Hibernate的不二选择。
Hibernate配置各种数据源 <hibernate-configuration> <!– 各属性的配置–> <!—为true表示将Hibernate发送给数据库的sql显示出来 –> ”show_sql”>true <!– SQL方言,这边设定的是MySQL –> ”dialect”>...
spring+hibernate解决多数据源问题3.pdf
Spring+Hibernate多数据源的整合实现demo