关于Batch update returned unexpected row count from update错误

    程序在服务器上运行导入数据任务(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万数据,没有出错。

 

你可能感兴趣的:(oracle,sql,Hibernate,SQL Server,jdbc)