Java mongodb连接配置实践
之前百度,google了很多,发现并没有介绍mongodb生产环境如何配置的文章,当时想参考下都不行,所以写篇文章,大家可以一块讨论下.
1.MongoClientOptions中的连接池配置:
配置如下:
connectionPoolSettings=ConnectionPoolSettings.builder() .minSize(getMinConnectionsPerHost()) .maxSize(getConnectionsPerHost()) .maxWaitQueueSize(getThreadsAllowedToBlockForConnectionMultiplier() *getConnectionsPerHost()) .maxWaitTime(getMaxWaitTime(),MILLISECONDS) .maxConnectionIdleTime(getMaxConnectionIdleTime(),MILLISECONDS) .maxConnectionLifeTime(getMaxConnectionLifeTime(),MILLISECONDS) .build();
minSize:线程池空闲时保持的最小连接数,默认是0.
maxSize:线程池允许的最大连接数,默认是100.
maxWaitQueueSize:线程池等待队列的大小,默认是500.
maxWaitTime:线程等待连接变为可用的最长时间.默认为2分钟.值为0意味着它不会等待.负值意味着它将无限期地等待
maxConnectionIdleTime:线程池中连接的最大空闲时间,0标志Udine空闲时间没有限制,超过这个时间会被关闭.
maxConnectionLifeTime:线程池中连接的最长生存时间.0表示没有限制.超过寿命的会被关闭,必要时通过新连接进行替换.
2.MongoClientOptions初始化
mongodb驱动中MongoClientOptions使用Buidler模式配置,有关所有属性的默认值,都是在Builder里边配置的.
关于Builder的配置如下:
publicstaticclassBuilder{ privateStringdescription; privateStringapplicationName; //读取偏好,这里默认的是从主节点读取. privateReadPreferencereadPreference=ReadPreference.primary(); //使用服务器默认的写关注? privateWriteConcernwriteConcern=WriteConcern.ACKNOWLEDGED; //使用服务的默认读关注,默认是local privateReadConcernreadConcern=ReadConcern.DEFAULT; privateCodecRegistrycodecRegistry=MongoClient.getDefaultCodecRegistry(); privatefinalListcommandListeners=newArrayList (); privatefinalList clusterListeners=newArrayList (); privatefinalList serverListeners=newArrayList (); privatefinalList serverMonitorListeners=newArrayList (); privateintminConnectionsPerHost; privateintmaxConnectionsPerHost=100; privateintthreadsAllowedToBlockForConnectionMultiplier=5; //设置服务器选择超时(以毫秒为单位),它定义驱动程序在抛出异常之前等待服务器选择成功的时间 //值为0表示如果没有可用的服务器,它将立即超时。负值意味着无限期等待 privateintserverSelectionTimeout=1000*30; //线程等待连接变为可用的最长时间 privateintmaxWaitTime=1000*60*2; //线程池中连接的最大空闲时间 privateintmaxConnectionIdleTime; privateintmaxConnectionLifeTime; //连接超时时间,必须大于0 privateintconnectTimeout=1000*10; //socket超时时间 privateintsocketTimeout=0; //socket是否保活 privatebooleansocketKeepAlive=false; privatebooleansslEnabled=false; privatebooleansslInvalidHostNameAllowed=false; privatebooleanalwaysUseMBeans=false; //设置心跳频率。这是驱动程序将尝试确定群集中每个服务器的当前状态的频率。默认值为10,000毫秒 privateintheartbeatFrequency=10000; //设置最小心跳频率。如果驱动程序必须经常重新检查服务器的可用性,它将至少在上一次检查后等待很长时间,以避免浪费精力。默认值为500毫秒。 privateintminHeartbeatFrequency=500; //设置用于集群心跳的连接的连接超时 privateintheartbeatConnectTimeout=20000; //设置用于集群心跳的连接的套接字超时 privateintheartbeatSocketTimeout=20000; //本地阈值 privateintlocalThreshold=15; privateStringrequiredReplicaSetName; privateDBDecoderFactorydbDecoderFactory=DefaultDBDecoder.FACTORY; privateDBEncoderFactorydbEncoderFactory=DefaultDBEncoder.FACTORY; privateSocketFactorysocketFactory; privatebooleancursorFinalizerEnabled=true; ...}
3.需要关心的配置
这里就因人而异了,我这列出比较重要的几个配置,具体的值看业务场景.
3.1读写相关
这应该是程序最应该关注的配置了,读关注,写关注,读取偏好.
//读取偏好,首先从从节点读取. privateReadPreferencereadPreference=ReadPreference.secondaryPreferred(); //写关注为1,写入主节点即返回. privateWriteConcernwriteConcern=WriteConcern.W1; //使用服务的默认读关注,默认是local(决定到某个读取数据时,能读到什么样的数据) privateReadConcernreadConcern=ReadConcern.LOCAL;
3.2线程池配置
//线程池空闲时保持的最小连接数 minConnectionsPerHost=20 //线程池允许的最大连接数 connectionsPerHost=100 //connectionsPerHost*5=最大队列数 threadsAllowedToBlockForConnectionMultiplier=5 //线程池中连接的最大空闲时间,5分钟 maxConnectionIdleTime=5*60*1000 //线程池中连接的最长生存时间,采用默认值 maxConnectionLifeTime
3.3连接配置
//设置服务器选择超时(以毫秒为单位),它定义驱动程序在抛出异常之前等待服务器选择成功的时间 //值为0表示如果没有可用的服务器,它将立即超时。负值意味着无限期等待 privateintserverSelectionTimeout=1000*30; //连接超时时间,必须大于0 privateintconnectTimeout=1000*5; //线程等待连接变为可用的最长时间. maxWaitTime=6000
这里建议这两个参数:maxWaitTime,connectTimeout,根据公司具体的业务来..
这是目前我在公司的配置参数,借鉴了其他的连接池配置比如:redis和mysql的,并不是最优的,还在摸索实践....
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。