-- MongoDb的连接字符串的标准格式,参数,Option属性介绍及应用示例
【官网】:https://www.mongodb.com/
应用场景
MongoDb的连接配置,通常可以根据场景配置成:内网免账号验证的,有账号密码验证的,有ApplicationName应用标识的等基础资源
Mongodb
使用须知
在配置MongoDb连接字符串时通常我们需要考虑:验证方式,全局还是指定数据库名,单台还是有主从服务器,是否需要溯源定位应用,超时时间,写入重试和读取重试策略等。
配置步骤
A)MongoDb连接配置格式及属性解释。
A1)连接的标准格式。
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
A2)连接字符串的参数介绍。
Mongodb:// |
必填的前缀,标识当前字符串为便准链接格式 |
username:password@ |
可选项,给出用户名和密码后,在连接数据库服务器后,驱动都会尝试登陆这个数据库 |
host |
uri里唯一的必填项,数据库的连接地址,人如果需要连接副本集,需要制定多个主机地址 |
:port |
可选项,如果不填则默认为27017端口 |
/database |
希望连接到的数据库名称,只要在设置username:password@后才会有效,如果不指定,则默认为admin数据库 |
?options |
可选项,如果不适用/database,则需要在前面加上/。所有连接选项都是键值对name=value格式,键值对之间使用&或;(分号)分割 |
A3)Option属性介绍。
connect=direct|replicaset |
direct: 直接建立一个到服务器的连接。如果指定了多个host,将按先后顺序挨个尝试建立连接,直到连接建立成功为止。如果只指定了一个host,则 direct 为默认值。 replicaset: 使用creplica set semantics建立连接(即使只提供了一个host)。指定的host作为种子列表来查找完整的replica set。当指定多个host时 replicaset 为默认值。 |
appName |
作为客户端的名字显示在调试日志中,也能显示在监控日志中 |
replicaset=name |
驱动验证建立连接的replica set的名字。应用于 connect=replicaset。 |
slaveok=true|false |
true: 对于 connect=direct 模式,驱动对列表中的第一个服务器建立连接,即使它不是主服务器。对 connect=replicaset 模式,驱动将所有写操作发送到主节点,将所有读操作按round robin顺序分发到从节点。 false: 对 connect=direct 模式,驱动按顺序尝试所有host直到找到主节点。对 connect=replicaset 模式,驱动将只连接到主节点,并将所有读操作和写操作都发送到主节点。 |
safe=true|false |
true: 驱动在每次更新操作后都发送 getlasterror 命令以确保更新成功(参考 w 和 wtimeout)。 false: 驱动每次更新操作后不发送 getlasterror 命令。 |
w=n |
w:代表server的数量:。 w=0 不等待,只返回网络错误 w=1 检查本机,并检查网络错误 w>1 检查w个server,并返回网络错误 应用于safe=true |
wtimeoutMS=ms |
写操作超时的时间,应用于 safe=true. |
fsync=true|false |
是不是等待刷新数据到磁盘,应用于safe=true |
journal=true|false |
是不是等待提交的数据已经写入到日志,并刷新到磁盘,应用于safe=true |
maxPoolSize=n minPoolSize=n |
一些驱动会把没用的连接关闭。 然而,如果连接数低于minPoolSize值之下, 它们不会关闭空闲的连接。注意:连接会按照需要进行创建,因此当连接池被许多连接预填充的时候,minPoolSize不会生效。 |
waitQueueTimeoutMS=ms |
在超时之前,线程等待连接生效的总时间。如果连接池到达最大并且所有的连接都在使用,这个参数就生效了。 |
waitQueueMultiple=n |
驱动强行限制线程同时等待连接的个数。 这个限制了连接池的倍数。 |
connectTimeoutMS=ms |
可以打开连接的时间。 |
socketTimeoutMS=ms |
发送和接受sockets的时间 |
ReadPreference |
primary 主节点,默认模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。 primaryPreferred 首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。 secondary 从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常。 secondaryPreferred 首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点。 nearest 最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点 |
B)MongoDb的连接配置示例。
b1)免账号验证+全局:连接配置.
mongodb://localhost:27017
b2)带账号密码验证+全局:连接配置.
mongodb://username:password@localhost:27017
b3)带账号密码验证+指定库名:连接配置.
<形式1> mongodb://username:password@localhost:27017?authSource=dbName
<形式2> mongodb://username:password@localhost:27017/dbName
b4)带账号密码验证+指定库名+指定当前应用名(方便溯源定位问题应用)连接配置.
mongodb://username:password@localhost:27017?authSource=dbName&appName=usercenter
[注]New in version 4.0.
b5)连接到repyca set 3台服务器(第一台为27017端口).
mongodb://localhost,localhost:27018,localhost:27019
b6)连接到repyca set 3台服务器,写入到主服务器,分布式查询到从服务器.
mongodb://localhost,localhost:27018,localhost:27019?slaveOk=true
b7)以安全模式连接到replica set,并且等待至少两个复制服务器成功写入,超时时间设置为2秒.
mongodb://localhost,localhost:27018,localhost:27019/?safe=true;w=2;wtimeoutMS=2000
c)在MongoDb.Driver的连接对象(MongoClientOptions)中设置属性。
mongodb.Driver中 MongoClientOptions 对象使用Buidler模式配置,有关所有属性的默认值,都是在Builder里边配置的.
因此当我们不方便在MongoDb连接字符串中设置时,可以通过该对象进行设置处理:
注: 下列applicationName等效于连接字符串中的appName.
public static class Builder {
private String description;
private String applicationName;
//读取偏好, 这里默认的是从主节点读取.
private ReadPreference readPreference = ReadPreference.primary();
//使用服务器默认的写关注?
private WriteConcern writeConcern = WriteConcern.ACKNOWLEDGED;
//使用服务的默认读关注,默认是local
private ReadConcern readConcern = ReadConcern.DEFAULT;
private CodecRegistry codecRegistry = MongoClient.getDefaultCodecRegistry();
private final List<CommandListener> commandListeners = new ArrayList<CommandListener>();
private final List<ClusterListener> clusterListeners = new ArrayList<ClusterListener>();
private final List<ServerListener> serverListeners = new ArrayList<ServerListener>();
private final List<ServerMonitorListener> serverMonitorListeners = new ArrayList<ServerMonitorListener>();
private int minConnectionsPerHost;
private int maxConnectionsPerHost = 100;
private int threadsAllowedToBlockForConnectionMultiplier = 5;
//设置服务器选择超时(以毫秒为单位),它定义驱动程序在抛出异常之前等待服务器选择成功的时间
//值为0表示如果没有可用的服务器,它将立即超时。 负值意味着无限期等待
private int serverSelectionTimeout = 1000 * 30;
//线程等待连接变为可用的最长时间
private int maxWaitTime = 1000 * 60 * 2;
// 线程池中连接的最大空闲时间
private int maxConnectionIdleTime;
private int maxConnectionLifeTime;
//连接超时时间,必须大于0
private int connectTimeout = 1000 * 10;
//socket超时时间
private int socketTimeout = 0;
//socket是否保活
private boolean socketKeepAlive = false;
private boolean sslEnabled = false;
private boolean sslInvalidHostNameAllowed = false;
private boolean alwaysUseMBeans = false;
//设置心跳频率。 这是驱动程序将尝试确定群集中每个服务器的当前状态的频率。 默认值为10,000毫秒
private int heartbeatFrequency = 10000;
//设置最小心跳频率。 如果驱动程序必须经常重新检查服务器的可用性,它将至少在上一次检查后等待很长时间,以避免浪费精力。 默认值为500毫秒。
private int minHeartbeatFrequency = 500;
//设置用于集群心跳的连接的连接超时
private int heartbeatConnectTimeout = 20000;
//设置用于集群心跳的连接的套接字超时
private int heartbeatSocketTimeout = 20000;
//本地阈值
private int localThreshold = 15;
private String requiredReplicaSetName;
private DBDecoderFactory dbDecoderFactory = DefaultDBDecoder.FACTORY;
private DBEncoderFactory dbEncoderFactory = DefaultDBEncoder.FACTORY;
private SocketFactory socketFactory;
private boolean cursorFinalizerEnabled = true;
...}
常见问题
快速入门
无