美文网首页我爱编程
mongodb的read preference及配置方法

mongodb的read preference及配置方法

作者: nextliving | 来源:发表于2018-07-25 14:59 被阅读1118次

read preference是使用mongodb中经常涉及到的概念,本文会探究read preference和它的5种取值,以及在程序中如何通过java config配置read preference。如果想通过xml方式配置请参阅ReadPreference读偏好

read preference

什么是read preference

官方对read preference的解释是:

Read preference describes how MongoDB clients route read operations to the members of a replica set

也就是说read preference是replica set中才会涉及到的概念,用于指定怎么读取数据。写操作一般都是在replica set中的主节点(primary).

read preference有哪些取值

主要有5种取值:

  • primary:默认值,此时只会从主节点读取数据。主节点不可用时会报错或者抛出异常。包含读操作的多文档事务Multi-document transactions必须使用这个值。
  • primaryPreferred:大多数情况下从主节点(primary)读取数据,主节点不可用时到从节点(secondary)读取数据。
  • secondary:只会到从节点(secondary)读取数据。写少读多的场景可以考虑使用这个值。
  • secondaryPreferred:大多数情况下到从节点读取数据,从节点不可用时到主节点读取数据。写少读多的场景可以考虑使用这个值。
  • nearest:到网络延迟最低的节点读取数据,不用管该节点是主节点还是从节点。

程序中通过Java Config配置read preference

主要可以通过2种方式配置:

  • uri中配置
  • MongoClientOptions中配置

开发环境

jar包版本为org.mongodb.mongodb-driver 3.6.4,服务端版本为3.6.6

uri中配置

可以在uri中拼接readPreference=primaryPreferred

@Bean
    public MongoClient mongoClient() {
        String uriString = "mongodb://username:password@cluster0-shard-00-00-75shm.gcp.mongodb.net:27017,"
                + "cluster0-shard-00-01-75shm.gcp.mongodb.net:27017,"
                + "cluster0-shard-00-02-75shm.gcp.mongodb.net:27017/?"
                + "ssl=true&replicaSet=Cluster0-shard-0&authSource=admin"
                + "&retryWrites=true&readPreference=primaryPreferred";
        MongoClientURI uri = new MongoClientURI(uriString);
        MongoClient mongoClient = new MongoClient(uri);
    
        return mongoClient;
    }

readPreference的其它值参考MongoClientURI。实际上,通过这种方式不止可以配置readPreference,还可以配置很多其它选项,参考MongoClientURI

MongoClientOptions中配置

代码示例如下:

    @Bean
    public MongoClient mongoClient() {
        List<ServerAddress> saList = new ArrayList<>();
        saList.add(new ServerAddress("cluster0-shard-00-00-75shm.gcp.mongodb.net", 27017));
        saList.add(new ServerAddress("cluster0-shard-00-01-75shm.gcp.mongodb.net", 27017));
        saList.add(new ServerAddress("cluster0-shard-00-02-75shm.gcp.mongodb.net", 27017));
        
        char[] pwd =  "password".toCharArray();
                //第二个参数“admin”对应authSource,也就是authentication database.
        MongoCredential credential = MongoCredential.createCredential("username", "admin", pwd);
    
        //必须设置sslEnabled为true,否则会报MongoSocketReadException: Prematurely reached end of stream错误
        MongoClientOptions options = MongoClientOptions.builder()
                .readPreference(ReadPreference.primaryPreferred())
                .retryWrites(true)
                .requiredReplicaSetName("Cluster0-shard-0")
                .maxConnectionIdleTime(6000)
                .sslEnabled(true)
                .build();
        
        MongoClient mongoClient = new MongoClient(saList, credential, options);     
        return mongoClient;
    }

这里必须提醒的是必须设置sslEnabled为true,否则会报MongoSocketReadException: Prematurely reached end of stream错误,参考MongoSocketReadException: Prematurely reached end of stream (after a period of inactivity)
。关于MongoClientOptions.builder所有选项参考Class MongoClientOptions.Builder,关于MongoCredential使用参考MongoCredential

相关文章

网友评论

    本文标题:mongodb的read preference及配置方法

    本文链接:https://www.haomeiwen.com/subject/xmcpmftx.html