Grails,多次保存到mongodb会引发乐观锁定异常

Grails,多次保存到mongodb会引发乐观锁定异常,mongodb,grails,optimistic-locking,Mongodb,Grails,Optimistic Locking,我有一个grails任务,它更新一个产品的totalSellCount,为此我运行了一个循环,我有一个map productTotalSellCount,它有每个产品的标识符和它的总销售计数,现在我迭代这个循环来更新所有产品的销售计数,如下所示 productTotalSellCount.each { k,v -> Product product = Product.findByIdentifier(k) product.totalSellC

我有一个grails任务,它更新一个产品的totalSellCount,为此我运行了一个循环,我有一个map productTotalSellCount,它有每个产品的标识符和它的总销售计数,现在我迭代这个循环来更新所有产品的销售计数,如下所示

productTotalSellCount.each { k,v ->
            Product product = Product.findByIdentifier(k)
            product.totalSellCount  = productTotalSellCount.get(k)
            product.save(flush: true)
    }

我有大约5万个产品,这是一个每天安排的工作,它总是失败,帮助

您应该使用批更新,而不是使用GORM:例如:

org.hibernate.StatelessSession session = grails.util.Holders.applicationContext.sessionFactory.openStatelessSession()
org.hibernate.Transaction tx = session.beginTransaction()

groovy.sql.Sql sql = new groovy.sql.Sql(session.connection())
//Create batch of 100 update statements before executing them to db
sql.withBatch(100, "update product set totalSellCount = :val0 where identifier = :val1") {
    groovy.sql.BatchingStatementWrapper stmt ->
        productTotalSellCount.each { identifier, value ->
            stmt.addBatch(val0: value, val1: identifier)
        }
}

tx.commit()
session.close()

您也可以尝试使用GPAR并行执行。

我尝试过这种方法,但由于找不到产品表,所以总是出现错误,而且我还担心是否可以对mongodb数据库进行sql批处理更新。