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。
网友评论