【问题标题】:Is it possible when using MongoTemplate to dynamically set read preference for a particular query?使用 MongoTemplate 为特定查询动态设置读取首选项时是否有可能?
【发布时间】:2020-04-29 20:31:26
【问题描述】:

在我们的应用程序中,我们管理多个MongoTemplate 实例,每个实例代表一个客户端数据库。对于大多数数据库操作,我们希望使用secondaryPreferred 读取首选项,以便利用集群的只读副本并分配负载。但是,至少在一种情况下,我们需要从主数据库中读取以获取最新数据。我看不到任何方法可以覆盖此单个查询的读取首选项。我在 JIRA 板上看到this issue,但它已经开放了 6 年,并且相关的 StackOverflow 链接已失效。假设不会实施,我正在尝试找出一些替代解决方案。这似乎是对可能选项的正确评估?

  1. 创建两个具有不同读取首选项的MongoClients,并使用它们为主要和次要读取创建一组单独的MongoTemplates。我担心这可能会创建双倍的集群连接数(尽管如果额外的连接都转到辅助节点,这可能不是问题)。
  2. 在执行操作之前使用MongoTemplate.setReadPreference() 方法临时更改读取首选项,然后在完成后将其重置。然而,这似乎很容易受到竞争条件的影响。
  3. 避开 Spring Data 框架,直接使用executeCommand(),它支持readPreference 参数。这意味着我们将失去 Spring Data 的所有优势和抽象,并且必须直接操作 BSON 对象。
  4. Query 类有一个 slaveOk() 方法,但这与我正在寻找的相反,似乎已被弃用。

也感谢任何进一步的信息。谢谢!

【问题讨论】:

    标签: mongodb spring-data spring-data-mongodb mongodb-java


    【解决方案1】:

    作为一种临时解决方案,我们可以覆盖 MongoTemplate 中的方法 prepareCollection(MongoCollection<Document> collection)(参考:here)并单独更改所需查询的读取首选项,让其余情况遵循默认的读取首选项

    【讨论】:

      【解决方案2】:

      顺便说一句,slaveOk() 似乎什么也没做 https://github.com/spring-projects/spring-data-mongodb/blob/f00991dc293dceee172b1ece6613dde599a0665d/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java#L3328

                              switch (option) {
      
                              case NO_TIMEOUT:
                                  cursorToUse = cursorToUse.noCursorTimeout(true);
                                  break;
                              case PARTIAL:
                                  cursorToUse = cursorToUse.partial(true);
                                  break;
                              case SECONDARY_READS:
                              case SLAVE_OK:
                                  break;
                              default:
                                  throw new IllegalArgumentException(String.format("%s is no supported flag.", option));
                          }
      

      【讨论】:

        猜你喜欢
        • 2019-04-23
        • 1970-01-01
        • 1970-01-01
        • 2018-12-27
        • 1970-01-01
        • 2019-03-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多