Java 代码里如何设置,可以让程序仅仅从 MongoDB 的主节点读写,而不从从节点读写

在 Java 中,如果你希望仅从 MongoDB 的主节点(primary node)进行读写操作,而避免从从节点(secondary nodes)读写,可以通过以下方式配置 MongoDB 客户端:

1. 使用 ReadPreference.primary() 配置

MongoDB 提供了 ReadPreference 类来定义客户端的读偏好。默认情况下,ReadPreference.primary() 只会从主节点读取数据。

你可以在创建 MongoDB 客户端时显式指定 ReadPreference.primary(),以确保所有读取操作都发生在主节点上。

代码示例

假设你使用 MongoDB 官方 Java 驱动(mongo-java-driver),代码可以如下配置:

import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientURI;
import com.mongodb.ReadPreference;
import com.mongodb.ServerAddress;

import java.util.Arrays;

public class MongoDBPrimaryReadExample {
    public static void main(String[] args) {
        // 创建 MongoClientOptions 并设置 ReadPreference 为 primary
        MongoClientOptions options = MongoClientOptions.builder()
                .readPreference(ReadPreference.primary())
                .build();
        
        // 使用自定义的 ServerAddress 连接 MongoDB Replica Set
        MongoClient mongoClient = new MongoClient(new ServerAddress("localhost", 27017), options);
        
        // 或者使用 URI 来创建 MongoClient 并指定 primary read preference
        MongoClientURI uri = new MongoClientURI("mongodb://localhost:27017/?readPreference=primary");
        MongoClient clientWithURI = new MongoClient(uri);

        // 继续使用 mongoClient 进行读写操作,默认会从 primary 节点读取数据
        // Write and read operations here
    }
}

2. URI 连接字符串配置

如果你使用的是 MongoDB URI 连接字符串,可以在连接字符串中指定 readPreference=primary 来确保读取操作仅从主节点执行。例如:

String uri = "mongodb://localhost:27017/?readPreference=primary";
MongoClientURI clientURI = new MongoClientURI(uri);
MongoClient mongoClient = new MongoClient(clientURI);

在该配置下,MongoDB 客户端会在连接到副本集时始终从主节点进行读操作。

3. 副本集环境中的主节点优先

MongoDB 副本集环境的工作机制是,所有的写操作都会被路由到主节点(primary node)。因此,对于写操作,你不需要进行特殊设置,MongoDB 会自动路由到主节点。上述 ReadPreference.primary() 主要用于确保读操作只从主节点进行,而不会从从节点获取可能滞后的数据。

总结

  1. 默认配置:在大多数情况下,MongoDB 自动将写操作路由到主节点,不需要特殊设置。
  2. 读操作:使用 ReadPreference.primary() 来确保所有读取操作只从主节点进行。

你可以根据具体使用的 MongoDB 驱动和 Java 版本选择适合的配置方式。

posted @   gongchengship  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示