关于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万数据,没有出错。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值