程序在服务器上运行导入数据任务(Hibernate & Oracle),到几万条的时候就会报如下错误:
引用
[org.hibernate.event.def.AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [3]; actual row count: -1; expected: 1
"row count: -1"这个返回值在Java文档中没有相关描述。而且程序在测试服务器上运行正常,导入40万条数据都不会报错。从网上的信息来看,SQL Server如果没设置好会导致这种错误,没提到Oracle也会如此。
查了一些帖子,觉得可能的原因有几个:
1、Oracle jdbc驱动有问题,有人换了一个驱动,问题不再重现,但也有号称换驱动后问题依旧存在。
2、Oracle 集群的问题。这是我个人的怀疑,因为本地单机Oracle导入没问题,而远程是一个集群环境,有可能在某种情况下集群没法返回sql语句影响到的记录数。
3、Hibernate bug。个人觉得这个可能性比较低。
解决办法:
1、禁用batch update,但是代价是降低了性能。
2、设置hibernate.jdbc.batch_size=3。这是有个老外提到的,没有原因,反正设了就好了。我采用的就是这种方法,目前在生产环境中已经导入近6000万数据,没有出错。