Mongodb - 在迁移过程中更新包含超过 100,000 个文档的集合

问题描述

在更新这个庞大的集合时,以下迁移代码似乎卡住了。

@ChangeSet(order = "010",id = "add_tenant_to_product",author = "pn")
fun addTenantToProduct(mongoTemplate: MongoTemplate) {
    log.info("Adding tenants to products")
    val query = Query()
    val update = Update()
    update.set("tenants",arrayOf("shared"))

    mongoTemplate.updateMulti(query,update,Product::class.java)
}

@ChangeSet(order = "011",id = "add_tenant_to_product_version",author = "pn")
fun addTenantToProductVersion(mongoTemplate: MongoTemplate) {
    log.info("Adding tenants to product-version")
    val query = Query()
    val update = Update()
    ...

应用程序日志的最后几行表示变更集被调用,但后续的没有被调用

2021-05-11 08:00:29.385 INFO [产品服务,] 1 --- [
main] c.a.a.mongock.changelog.Migration :将租户添加到 产品

2021-05-11 08:00:29.576 INFO [产品服务,] 1 --- [
main] org.mongodb.driver.connection : 打开连接

Spring 执行器健康探测因此失败,容器不断重启。有没有更好的 API 可以更快地使用?

注意:

  1. 使用的版本:'com.github.cloudyrock:mongock:1.12'
  2. 下面是配置
@Profile("!tenant")
@Configuration
class MongockConfig : AbstractMongoConfiguration() {

    @Value("\${spring.data.mongodb.uri}")
    private lateinit var uri: String

    @Value("\${spring.data.mongodb.database}")
    private lateinit var database: String

    override fun mongoClient(): MongoClient {
        return MongoClient(MongoClientURI(uri))
    }

    override fun getDatabaseName(): String {
        return database
    }

    @Bean
    fun mongock(): Mongock {
        return MongockBuilder(mongoClient(),databaseName,"com.somepackage.mongock.changelog")
            .setMongoTemplate(mongoTemplate())
            .setLockQuickConfig()
            .build()
    }
}

这是日志


2021-05-10 10:59:33.406 INFO [product-service,] 1 --- [ main] org.mongodb.driver.connection : 打开连接 [connectionId{localValue:16,serverValue:26359638} ] 到 dummy-clusterr-39649.servers.mongodirector.com:27017 2021-05-10 10:59:33.525 INFO [product-service,] 1 --- [main] c.github.cloudyrock.mongock.LockChecker:Mongbee 试图获取锁 2021-05-10 10:59:33.574 INFO [product-service,] 1 --- [main] c.github.cloudyrock.mongock.LockChecker:锁被其他进程占用,直到:5 月 10 日星期一 11:01 :03 格林威治标准时间 2021 2021-05-10 10:59:33.574 INFO [product-service,] 1 --- [main] c.github.cloudyrock.mongock.LockChecker :Mongock 将进入睡眠等待锁定:90265 毫秒( 1 分钟) 2021-05-10 11:01:03.839 INFO [product-service,] 1 --- [main] c.github.cloudyrock.mongock.LockChecker:Mongbee 试图获取锁 2021-05-10 11:01:03.844 INFO [product-service,] 1 --- [main] c.github.cloudyrock.mongock.LockChecker:Mongbee 获得锁,直到:5 月 10 日星期一 11:04:03格林威治标准时间 2021 2021-05-10 11:01:03.844 INFO [product-service,] 1 --- [main] com.github.cloudyrock.mongock.Mongock : Mongock 开始数据迁移序列.. 2021-05-10 11:01:03.982 INFO [product-service,] 1 --- [main] org.reflections.Reflections : Reflections 用了 60 毫秒来扫描 1 个 url,产生 2 个键和 3 个值 2021-05-10 11:01:04.038 INFO [product-service,] 1 --- [main] com.github.cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@7abd0e71 2021-05-10 11:01:04.046 INFO [product-service,] 1 --- [main] com.github.cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@6635f36 pass over 2021-05-10 11:01:04.047 INFO [product-service,] 1 --- [main] com.github.cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@61352a80 2021-05-10 11:01:04.052 INFO [product-service,] 1 --- [main] com.github.cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@7576ed14 2021-05-10 11:01:04.054 INFO [product-service,] 1 --- [main] com.github.cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@b0302179 pass over 2021-05-10 11:01:04.068 INFO [product-service,] 1 --- [main] com.github.cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@e6caade0 2021-05-10 11:01:04.071 INFO [product-service,] 1 --- [main] com.github.cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@2688129a 2021-05-10 11:01:04.073 INFO [product-service,] 1 --- [main] com.github.cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@e46af677 2021-05-10 11:01:04.075 INFO [产品服务,] 1 --- [主要] com.github.cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@d788b92f 2021-05-10 11:01:04.077 INFO [product-service,] 1 --- [ main] c.a.a.mongock.changelog.Migration :向问题添加组织 2021-05-10 11:01:04.158 INFO [product-service,] 1 --- [main] org.mongodb.driver.connection:打开连接 [connectionId{localValue:17,serverValue:26359725}] 到虚拟-clusterr-39649.servers.mongodirector.com:27017

解决方法

您能否提供更多信息,例如您使用的 mongock 版本、日志跟踪(您显示的内容不足以进行诊断)、mongock 配置等?

另一方面,您应该直接使用 MongockTempalte 而不是 MongoTemplate。这是相同的 API,你不会错过任何东西。实际上直接使用 MongoTemplate 应该会抛出异常。

有关详细信息,请查看Mongock's documenation

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...