【发布时间】:2020-04-29 20:31:26
【问题描述】:
在我们的应用程序中,我们管理多个MongoTemplate 实例,每个实例代表一个客户端数据库。对于大多数数据库操作,我们希望使用secondaryPreferred 读取首选项,以便利用集群的只读副本并分配负载。但是,至少在一种情况下,我们需要从主数据库中读取以获取最新数据。我看不到任何方法可以覆盖此单个查询的读取首选项。我在 JIRA 板上看到this issue,但它已经开放了 6 年,并且相关的 StackOverflow 链接已失效。假设不会实施,我正在尝试找出一些替代解决方案。这似乎是对可能选项的正确评估?
- 创建两个具有不同读取首选项的
MongoClients,并使用它们为主要和次要读取创建一组单独的MongoTemplates。我担心这可能会创建双倍的集群连接数(尽管如果额外的连接都转到辅助节点,这可能不是问题)。 - 在执行操作之前使用
MongoTemplate.setReadPreference()方法临时更改读取首选项,然后在完成后将其重置。然而,这似乎很容易受到竞争条件的影响。 - 避开 Spring Data 框架,直接使用
executeCommand(),它支持readPreference参数。这意味着我们将失去 Spring Data 的所有优势和抽象,并且必须直接操作 BSON 对象。 -
Query类有一个slaveOk()方法,但这与我正在寻找的相反,似乎已被弃用。
也感谢任何进一步的信息。谢谢!
【问题讨论】:
标签: mongodb spring-data spring-data-mongodb mongodb-java