Spring Boot中使用MongoDB的连接池配置

因为今天开发遇到了性能问题,可能与MongoDB的连接有关,所以稍稍深入看了一下,正好搜到原来有人写过这篇相关的内容,所以转载过来。回头有时间可以写个扩展到SpringForAll里,主体思路还是一样的。感谢这位美女程序媛的文章!

说明

Spring Boot中通过依赖spring-boot-starter-data-mongodb,来实现spring-data-mongodb的自动配置。
但是默认情况下,Spring Boot 中,并没有像使用MySQL或者Redis一样,提供了连接池配置的功能。因此,我们需要自行重写 MongoDbFactory,实现MongoDB客户端连接的参数配置扩展。

需要说明的是,MongoDB的客户端本身就是一个连接池,因此,我们只需要配置客户端即可。

配置文件

为了统一Spring Boot的配置,我们要将重写的配置也配置到 application.yml中,前缀为spring.data.mongodb.custom下(前缀可自己随意配置):

spring:
data:
mongodb:
custom:
hosts:
- 10.0.5.1
- 10.0.5.1
ports:
- 27017
- 27018
replica-set: mgset-3590061
username: jancee
password: abc123
database: jancee
authentication-database: admin
connections-per-host: 20
min-connections-per-host: 20

该配置例子中,配置了副本集,其中包含了主机10.0.5.1:2701710.0.5.1:27018,其它配置与Spring Boot的标准配置类似,另外,connections-per-host为客户端的连接数,in-connections-per-host为客户端最小连接数。

将配置包装成类

为方便调用和可读性,将上述配置包装成一个配置实体类,MongoConfig.java代码如下:

package com.feidiao.jancee.fdiot.api.config.mongo;

import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import java.util.List;

@Component
@Validated
public class MongoSettingsProperties {

@NotBlank
private String database;

@NotEmpty
private List<String> hosts;

@NotEmpty
private List<Integer> ports;

private String replicaSet;
private String username;
private String password;
private String authenticationDatabase;
private Integer minConnectionsPerHost = 10;
private Integer connectionsPerHost = 2;

public MongoSettingsProperties() {

}

public String getDatabase() {
return database;
}

public void setDatabase(String database) {
this.database = database;
}

public List<String> getHosts() {
return hosts;
}

public void setHosts(List<String> hosts) {
this.hosts = hosts;
}

public List<Integer> getPorts() {
return ports;
}

public void setPorts(List<Integer> ports) {
this.ports = ports;
}

public String getReplicaSet() {
return replicaSet;
}

public void setReplicaSet(String replicaSet) {
this.replicaSet = replicaSet;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getAuthenticationDatabase() {
return authenticationDatabase;
}

public void setAuthenticationDatabase(String authenticationDatabase) {
this.authenticationDatabase = authenticationDatabase;
}

public Integer getMinConnectionsPerHost() {
return minConnectionsPerHost;
}

public void setMinConnectionsPerHost(Integer minConnectionsPerHost) {
this.minConnectionsPerHost = minConnectionsPerHost;
}

public Integer getConnectionsPerHost() {
return connectionsPerHost;
}

public void setConnectionsPerHost(Integer connectionsPerHost) {
this.connectionsPerHost = connectionsPerHost;
}
}

覆盖MongoDbFactory

接下来,就是覆盖Spring Boot原有的MongoDbFactory Bean,新建文件MongoConfig.java,代码如下:

import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class MongoConfig {


// 注入配置实体
@Autowired
private MongoSettingsProperties mongoSettingsProperties;
@Bean
@ConfigurationProperties(
prefix = "spring.data.mongodb.custom")
MongoSettingsProperties mongoSettingsProperties() {
return new MongoSettingsProperties();
}

// 覆盖默认的MongoDbFactory
@Bean
MongoDbFactory mongoDbFactory() {
//客户端配置(连接数、副本集群验证)
MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
builder.connectionsPerHost(mongoSettingsProperties.getConnectionsPerHost());
builder.minConnectionsPerHost(mongoSettingsProperties.getMinConnectionsPerHost());
if (mongoSettingsProperties.getReplicaSet() != null) {
builder.requiredReplicaSetName(mongoSettingsProperties.getReplicaSet());
}
MongoClientOptions mongoClientOptions = builder.build();

// MongoDB地址列表
List<ServerAddress> serverAddresses = new ArrayList<>();
for (String host : mongoSettingsProperties.getHosts()) {
Integer index = mongoSettingsProperties.getHosts().indexOf(host);
Integer port = mongoSettingsProperties.getPorts().get(index);

ServerAddress serverAddress = new ServerAddress(host, port);
serverAddresses.add(serverAddress);
}
System.out.println("serverAddresses:" + serverAddresses.toString());

// 连接认证
List<MongoCredential> mongoCredentialList = new ArrayList<>();
if (mongoSettingsProperties.getUsername() != null) {
mongoCredentialList.add(MongoCredential.createScramSha1Credential(
mongoSettingsProperties.getUsername(),
mongoSettingsProperties.getAuthenticationDatabase() != null ? mongoSettingsProperties.getAuthenticationDatabase() : mongoSettingsProperties.getDatabase(),
mongoSettingsProperties.getPassword().toCharArray()));
}
System.out.println("mongoCredentialList:" + mongoCredentialList.toString());

//创建客户端和Factory
MongoClient mongoClient = new MongoClient(serverAddresses, mongoCredentialList, mongoClientOptions);
MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, mongoSettingsProperties.getDatabase());

return mongoDbFactory;
}
}

在这里,实现了MongoDB连接时,前面配置的参数的设置,按照自己的实际情况,可以在new SimpleMongoDbFactory时,增加修改自己需要的配置参数。

至此,就完成了全部配置,运行测试即可。


money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 409. 最长回文串(计数)

1. 题目 给定一个包含大写字母和小写字母的字符串&#xff0c;找到通过这些字母构造成的最长的回文串。 在构造过程中&#xff0c;请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。 注意: 假设字符串的长度不会超过 1010。 示例 1: 输入: "abccccdd" 输出…

又一名视觉大牛从大厂离开!阿里达摩院 XR 实验室负责人谭平离职

文 | 王玥编 | 陈彩娴源 | AI科技评论AI科技评论获悉&#xff0c;阿里巴巴达摩院 XR 实验室负责人谭平已于近日离职。谭平曾受邀担任国际顶级学术会议CVPR、SIGGRAPH、IROS领域主席&#xff0c;是3D视觉领域的标杆人物。谭平于2019年9月入职阿里人工智能实验室担任计算机视觉首…

【小马哥】Spring Boot系列讲座

这里推荐一个不错的Spring Boot系列讲座&#xff0c;讲师简介如下&#xff1a; 小马哥&#xff0c;阿里巴巴技术专家&#xff0c;从事十余年Java EE 开发&#xff0c;国内微服务技术讲师。目前主要负责微服务技术推广、架构设计、基础设施、迁移等。重点关注云计算、微服务以及…

程序员面试金典 - 面试题 03.03. 堆盘子 (vector(stack))

1. 题目 堆盘子。设想有一堆盘子&#xff0c;堆太高可能会倒下来。因此&#xff0c;在现实生活中&#xff0c;盘子堆到一定高度时&#xff0c;我们就会另外堆一堆盘子。 请实现数据结构SetOfStacks&#xff0c;模拟这种行为。SetOfStacks 应该由多个栈组成&#xff0c;并且在…

事件冒泡控件示例(转载)

.NET Framework 开发员指南 事件冒泡ASP.NET 页框架提供一种称为“事件冒泡”的技术&#xff0c;允许子控件将事件沿其包容层次结构向上传播。事件冒泡允许在控件层次结构中更方便的位置引发事件&#xff0c;并且允许将事件处理程序附加到原始控件以及公开冒泡的事件的控件上。…

Oracle 大规模裁员进行时:营收暴跌 28%,数据库地位被侵蚀

源 | InfoQ裁员潮席卷国外大厂&#xff0c;数据库巨头 Oracle 也不例外。“我的经理给我打了 3 分钟的电话。毫无情感地告诉我&#xff1a;你的职位被取消了&#xff0c;人力资源部稍后会把细节发给你&#xff0c;再见。”“我在 CX 营销部门工作了 8 年。HR 昨天下午打电话给我…

Spring Boot中使用RabbitMQ

很久没有写Spring Boot的内容了&#xff0c;正好最近在写Spring Cloud Bus的内容&#xff0c;因为内容会有一些相关性&#xff0c;所以先补一篇关于AMQP的整合。 Message Broker与AMQP简介 Message Broker是一种消息验证、传输、路由的架构模式&#xff0c;其设计目标主要应用…

程序员面试金典 - 面试题 03.05. 栈排序(两栈)

1. 题目 栈排序。 编写程序&#xff0c;对栈进行排序使最小元素位于栈顶。 最多只能使用一个其他的临时栈存放数据&#xff0c;但不得将元素复制到别的数据结构&#xff08;如数组&#xff09;中。 该栈支持如下操作&#xff1a;push、pop、peek 和 isEmpty。当栈为空时&#…

大足石刻一日游

今天早上9点半从重庆出发&#xff0c;11点半到的目的地。玩了3个小时&#xff0c;下午5点又回来了。逛了一会儿&#xff0c;感觉被骗了&#xff0c;没多少东西嘛&#xff0c;好多石刻都被风化的差不多了&#xff0c;1个小时就出来了&#xff0c;80块的门票真“值”。下面是手机…

为什么说工作期间需要摸鱼?

文 | 梦晨(发自凹非寺)源 | 量子位一努力思考就会精神疲惫&#xff0c;学习工作一天之后只想无脑躺平。最新研究发现&#xff0c;这并不是你一个人的错&#xff0c;而是有着普遍的生理基础&#xff1a;思考时脑内会产生一种毒素&#xff0c;积累太多会破坏大脑功能&#xff0c;…

Spring boot中使用log4j记录日志

之前在Spring Boot日志管理 一文中主要介绍了Spring Boot中默认日志工具&#xff08;logback&#xff09;的基本配置内容。对于很多习惯使用log4j的开发者&#xff0c;Spring Boot依然可以很好的支持&#xff0c;只是需要做一些小小的配置功能。 引入log4j依赖 在创建Spring …

4.7 【共享源】流的生产者(二)

七,模式 流的模式决定了Screen如何使前台缓冲区可用。生产者通过调用screen_set_stream_property_iv()并设置SCREEN_PROPERTY_MODE属性来设置模式。有效模式如下: 7.1 SCREEN_STREAM_MODE_DEFAULT 如果生产者应用程序没有在流上明确设置 SCREEN_PROPERTY_MODE 属性,则 Sc…

程序员面试金典 - 面试题 03.06. 动物收容所(队列)

1. 题目 动物收容所。有家动物收容所只收容狗与猫&#xff0c;且严格遵守“先进先出”的原则。 在收养该收容所的动物时&#xff0c;收养人只能收养所有动物中“最老”&#xff08;由其进入收容所的时间长短而定&#xff09;的动物&#xff0c;或者可以挑选猫或狗&#xff08…

Enterprise Blocks

我在Visual Studio .NET Web Control for Business Intelligence 中介绍的一个BI工具。支持DNN和SPS&#xff0c;太有心了&#xff01;找到一篇中文介绍文章。 Enterprise Blocks是ASP.NET Web控件、web服务、Windows服务的完整集合&#xff0c;在开发分析应用系统中可以作…

2022年竞赛打榜,神经网络还是干不过树模型??

文 | QvQ随着深度神经网络的不断发展&#xff0c;DNN在图像、文本和语音等类型的数据上都有了广泛的应用&#xff0c;然而对于同样非常常见的一种数据——表格数据&#xff0c;DNN却似乎并没有取得像它在其他领域那么大的成功。从Kaggle平台上对数据挖掘竞赛Top团队使用的工具统…

支持向量机(Support Vector Machines,SVM)

文章目录1. 线性可分SVM 与 硬间隔最大化1.1 线性可分SVM1.2 函数间隔、几何间隔1.3 间隔最大化2. 线性SVM 与 软间隔最大化2.1 线性SVM3. 非线性SVM 与 核函数3.1 核技巧/核函数3.2 常用核函数3.3 非线性SVM分类4. 序列最小最优化算法5. sklearn SVC 实例6. 课后习题支持向量机…

Bengio团队发起AI竞赛!

源 | AI4ClimateCoop比赛主办方&#xff1a;由MILA&#xff08;蒙特利尔人工智能实验室&#xff09;& Salesforce&#xff08;北美顶级云科技公司&#xff09;共同组织&#xff0c;由AI Economist团队领队Stephan Zheng博士和图灵奖得主Yoshua Bengio教授共同指导。比赛目标…

.NET Framework 1.1安装出现1935错误的解决办法

系统不知道什么原因&#xff0c;.NET Framework 1.1不能用了&#xff0c;得重装&#xff0c;但是重装了一次&#xff0c;每次老是提示错误1935&#xff0c;如图没有办法&#xff0c;上网查找相关资料&#xff0c;有文章介绍&#xff1a;“卸载Visual Studio .NET的预发布版之后…

ICLR Spotlight|Facebook提出无损INT8优化器,单机可以跑千亿参数模型了??

文 | 王思若2018年GPT、BERT预训练模型的提出吹响了大模型“军备竞赛”冲锋的号角&#xff0c;一场大模型的狂欢拉开帷幕&#xff0c;业界强大的算力支撑起例如Megatron-Turing、Switch Transformer、悟道2.0等千亿&万亿参数量模型。与此同时&#xff0c;面对着超大模型训练…

程序员面试金典 - 面试题 04.01. 节点间通路(图的遍历)

1. 题目 节点间通路。给定有向图&#xff0c;设计一个算法&#xff0c;找出两个节点之间是否存在一条路径。 示例1:输入&#xff1a;n 3, graph [[0, 1], [0, 2], [1, 2], [1, 2]],start 0, target 2输出&#xff1a;true 示例2:输入&#xff1a;n 5, graph [[0, 1], […