Springboot 集成 mongodb

一、引入依赖
1.1 Maven

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>


二、yml 配置文件

data:mongodb:# 基础链接参数# 连接的库database: mongodb# 用户名username: mongodb# 密码password: mongodb# IP和端口(host:port),例如127.0.0.1:27017。集群模式用,分隔开,例如host1:port1,host2:port2address: 192.168.1.1:3717,192.168.1.2:3717# 设置认证数据库,如果有的话authenticationDatabase: # 客户端连接池参数clientName: ${spring.application.name}# TCP(socket)连接超时时间,毫秒connectionTimeoutMs: 5000# TCP(socket)连接闲置时间,毫秒maxConnectionIdleTimeMs: 60000# TCP(socket)连接最多可以使用多久,毫秒maxConnectionLifeTimeMs: 300000#TCP(socket)读取超时时间,毫秒readTimeoutMs: 15000#心跳检测发送频率,毫秒heartbeatFrequencyMs: 20000#线程池允许的最大连接数connectionsPerHost: 100#线程池空闲时保持的最小连接数minConnectionsPerHost: 20

三、MongoConfig配置类
部分可以配置可以查看源代码 AbstractMongoClientConfiguration 类

@Configuration
@EnableConfigurationProperties(MongoConfig.MongoClientOptionProperties.class)
@Slf4j
public class MongoConfig {/*** 转换器* MappingMongoConverter可以自定义mongo转换器,主要自定义存取mongo数据时的一些操作,例如 mappingConverter.setTypeMapper(new* DefaultMongoTypeMapper(null)) 方法会将mongo数据中的_class字段去掉。** @param factory     mongo工厂* @param context     上下文* @param beanFactory 自定义转换器* @return 转换器对象*/@Beanpublic MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory factory, MongoMappingContext context, BeanFactory beanFactory) {DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);try {mappingConverter.setCustomConversions(beanFactory.getBean(CustomConversions.class));} catch (NoSuchBeanDefinitionException ignore) {}// 保存不需要 _class to 字段 mongomappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));return mappingConverter;}@Beanpublic MongoTypeMapper defaultMongoTypeMapper() {return new DefaultMongoTypeMapper(null);}/*** 此Bean也是可以不显示定义的,如果我们没有显示定义生成MongoTemplate实例,* SpringBoot利用我们配置好的MongoDbFactory在配置类中生成一个MongoTemplate,* 之后我们就可以在项目代码中直接@Autowired了。因为用于生成MongoTemplate* 的MongoDbFactory是我们自己在MongoConfig配置类中生成的,所以我们自定义的连接池参数也就生效了。** @param mongoDbFactory mongo工厂* @param converter      转换器* @return MongoTemplate实例*/@Beanpublic MongoTemplate mongoTemplate(MongoDatabaseFactory mongoDbFactory, MappingMongoConverter converter) {MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);// 设置读从库优先mongoTemplate.setReadPreference(ReadPreference.secondaryPreferred());return mongoTemplate;}/*** 自定义mongo连接池** @param properties 属性配置类* @return MongoDbFactory对象*/@Beanpublic MongoDatabaseFactory mongoDbFactory(MongoClientOptionProperties properties) {// 创建客户端参数MongoClientSettings mongoClientOptions = mongoClientSettings(properties);// Mongo ClientMongoDriverInformation info = MongoDriverInformation.builder().build();MongoClient mongoClient = new MongoClientImpl(mongoClientOptions, info);return new SimpleMongoClientDatabaseFactory(mongoClient, properties.database);}@Beanpublic MongoClientSettings mongoClientSettings(MongoClientOptionProperties properties) {// 创建认证MongoCredential mongoCredential = getCredential(properties);// 解析获取mongo服务地址List<ServerAddress> serverAddressList = getServerAddress(properties.getAddress());return MongoClientSettings.builder()//#客户端的标识,用于定位请求来源等,一般用程序名.applicationName(properties.clientName)//配置IP地址.applyToClusterSettings(i -> i.hosts(serverAddressList))//配置认证.credential(mongoCredential).applyToSocketSettings(i -> i//TCP(socket)读取超时时间,毫秒.readTimeout(properties.readTimeoutMs, TimeUnit.MILLISECONDS)//TCP(socket)连接超时时间,毫秒.connectTimeout(properties.connectionTimeoutMs, TimeUnit.MILLISECONDS)).applyToConnectionPoolSettings(i -> i//TCP(socket)连接闲置时间,毫秒.maxConnectionIdleTime(properties.maxConnectionIdleTimeMs, TimeUnit.MILLISECONDS)//TCP(socket)连接最多可以使用多久,毫秒.maxConnectionLifeTime(properties.maxConnectionIdleTimeMs, TimeUnit.MILLISECONDS)//当连接池无可用连接时客户端阻塞等待的最大时长,毫秒.maxWaitTime(properties.maxWaitTimeMs, TimeUnit.MILLISECONDS).maxSize(properties.connectionsPerHost).minSize(properties.minConnectionsPerHost)).applyToServerSettings(i -> i.heartbeatFrequency(properties.heartbeatFrequencyMs, TimeUnit.MILLISECONDS).minHeartbeatFrequency(properties.minHeartbeatFrequencyMs, TimeUnit.MILLISECONDS)).build();}/*** 创建认证** @param properties 属性配置类* @return 认证对象*/private MongoCredential getCredential(MongoClientOptionProperties properties) {if (!StringUtils.isEmpty(properties.getUsername()) && !StringUtils.isEmpty(properties.getPassword())) {// 没有专用认证数据库则取当前数据库String database = StringUtils.isEmpty(properties.getAuthenticationDatabase()) ?properties.getDatabase() : properties.getAuthenticationDatabase();return MongoCredential.createCredential(properties.getUsername(), database,properties.getPassword().toCharArray());}return null;}/*** 获取数据库服务地址** @param mongoAddress 地址字符串* @return 服务地址数组*/private List<ServerAddress> getServerAddress(String mongoAddress) {String[] mongoAddressArray = mongoAddress.trim().split(",");List<ServerAddress> serverAddressList = new ArrayList<>(4);for (String address : mongoAddressArray) {String[] hostAndPort = address.split(":");serverAddressList.add(new ServerAddress(hostAndPort[0], Integer.parseInt(hostAndPort[1])));}return serverAddressList;}@Setter@Getter@Accessors(chain = true)@ConfigurationProperties(prefix = "data.mongodb")public class MongoClientOptionProperties {/*** 基础连接参数*/// 要连接的数据库@NotEmptyprivate String database;// 用户名private String username;// 密码private String password;// IP和端口(host:port),例如127.0.0.1:27017。集群模式用,分隔开,例如host1:port1,host2:port2//@NotEmptyprivate String address;// 设置认证数据库,如果有的话private String authenticationDatabase;/*** 客户端连接池参数*/@NotEmptyprivate String clientName; // 客户端的标识,用于定位请求来源等,一般用程序名@Min(value = 1)private int connectionTimeoutMs; // TCP(socket)连接超时时间,毫秒@Min(value = 1)private int maxConnectionIdleTimeMs; // TCP(socket)连接闲置时间,毫秒@Min(value = 1)private int maxConnectionLifeTimeMs; // TCP(socket)连接最多可以使用多久,毫秒@Min(value = 1)private int readTimeoutMs; // TCP(socket)读取超时时间,毫秒@Min(value = 1)private int maxWaitTimeMs; // 当连接池无可用连接时客户端阻塞等待的最大时长,毫秒@Min(value = 2000)private int heartbeatFrequencyMs; // 心跳检测发送频率,毫秒@Min(value = 300)private int minHeartbeatFrequencyMs; // 最小的心跳检测发送频率,毫秒@Min(value = 200)private int heartbeatConnectionTimeoutMs; // 心跳检测连接超时时间,毫秒@Min(value = 200)private int heartbeatReadTimeoutMs; // 心跳检测读取超时时间,毫秒@Min(value = 1)private int connectionsPerHost; // 线程池允许的最大连接数@Min(value = 1)private int minConnectionsPerHost; // 线程池空闲时保持的最小连接数@Min(value = 1)// 计算允许多少个线程阻塞等待时的乘数,算法:threadsAllowedToBlockForConnectionMultiplier*maxConnectionsPerHostprivate int threadsAllowedToBlockForConnectionMultiplier;

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

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

相关文章

单例模式读取配置文件

单例模式&#xff08;Singleton Pattern&#xff09;是一种常见的设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点以获取该实例。当你需要在应用程序中读取配置文件时&#xff0c;使用单例模式可以确保你只创建一个配置对象&#xff0c;以避免重…

聊聊定时器 setTimeout 的时延问题

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 全局的 setTimeout() 方法设置一个定时器&#xff0c;一旦定时器到期&#xff0c;就会执行一个函数或指定的代码片…

字符函数和字符串函数详解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1. 字符分类函数 2. 字符转换函数 3. strlen的使用和模拟实现 3.1strlen的使用&#xff1a; 3.2strlen的模拟实现&#xff1a; 4. strcpy的使用和模拟实现 4.1strc…

漏刻有时百度地图API实战开发(1)华为手机无法使用addEventListener click 的兼容解决方案

现象 漏刻有时项目开发中的调用了百度地图API&#xff0c;在PC端、IOS和安卓机型测试都没有问题。但是使用华为手机部分型号时&#xff0c;前端在监听点击事件的时候是使用 map.addEventListener(click,function(){...})&#xff0c;无法触发。或 原理 通过监听touchstart和…

FreeRTOS_低功耗Tickless模式

目录 1. STM32F4 低功耗模式 1.1 睡眠(Sleep)模式 1.2 停止(Stop)模式 1.3 待机(Standby)模式 2. Tickless 模式详解 2.1 如何降低功耗 2.2 Tickless 具体实现 2.2.1 宏 configUSE_TICKLESS_IDLE 2.2.2 宏 portSUPPRESS_TICKS_AND_SLEEP() 2.2.3 宏 configPRE_SLEEP_…

利用Caddy实现http反向代理

利用Caddy实现http反向代理 1 Caddy是什么 Caddy是一个开源的&#xff0c;使用Golang编写的&#xff0c;支持HTTP/2的Web服务端。它的一个显著特征就是默认启用HTTPS。 和nginx类似。 2 多个后端服务 假如现在有3个后端http服务&#xff1a;分别在启动在 app1 http://10…

Django初窥门径-自定义附件存储模型

前言 Django自带了一个名为FileField的字段&#xff0c;用于处理文件上传。然而&#xff0c;有时我们需要更多的控制权&#xff0c;例如定义文件的存储路径、文件名以及文件类型。在本篇文章中&#xff0c;我们将探讨如何自定义Django附件存储模型。 创建attachment应用 pyt…

Python|OpenCV-图像的添加和混合操作(8)

前言 本文是该专栏的第8篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在使用OpenCV库对图像操作的时候,有时需要对图像进行运算操作,类似于加法,减法,位操作等处理。而本文,笔者将针对OpenCV对图像的添加,混合以及位操作进行详细的介绍说明和使用。 下面,…

ZKP8.1 Polynomial-IOP and Polynomial Commitment Schemes

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 8: FRI-based Polynomial Commitments and Fiat-Shamir (Justin Thaler) 8.1 Polynomial-IOP and Polynomial Commitment Schemes Recall: build an efficient SNARK Recall: Polynomial-IOP P’s first message in the pro…

YOLOv8轻量化模型:模型轻量化设计 | 轻量级可重参化EfficientRep| 来自YOLOv6思想

💡💡💡本文解决什么问题:在几乎不保证精度下降的前提下,轻量级模型创新设计 EfficientRep 在关键点检测任务中 | GFLOPs从9.6降低至8.5, mAP50从0.921下降至0.912,mAP50-95从0.697提升至0.779 YOLO轻量化模型专栏:http://t.csdnimg.cn/AeaEF 1.YOLOv6介绍 论文…

pandas教程:Data Transformation 数据变换、删除和替换

文章目录 7.2 Data Transformation&#xff08;数据变换&#xff09;1 删除重复值2 Transforming Data Using a Function or Mapping&#xff08;用函数和映射来转换数据&#xff09;3 Replacing Values&#xff08;替换值&#xff09;4 Renaming Axis Indexes&#xff08;重命…

API接口安全设计

简介 HTTP接口是互联网各系统之间对接的重要方式之一&#xff0c;使用HTTP接口开发和调用都很方便&#xff0c;也是被大量采用的方式&#xff0c;它可以让不同系统之间实现数据的交换和共享。 由于HTTP接口开放在互联网上&#xff0c;所以我们就需要有一定的安全措施来保证接口…

#龙迅视频转换IC LT7911D是一款高性能Type-C/DP/EDP 转MIPI®DSI/CSI/LVDS 芯片,适用于VR/显示应用。

1.说明 应用功能&#xff1a;LT7911D适用于DP1.2转MIPIDSI/MIPICSI/LVDS&#xff0c;EDP转MIPIDSI/MIPICSI/LVDS&#xff0c;TYPE-C转MIPIDSI/MIPICSI/LVDS应用方案 分辨率&#xff1a;单PORT高达4K30HZ&#xff0c;双PORT高达4K 60HZ 工作温度范围&#xff1a;−40C to 85C 产…

多比特杯武汉工程大学第六届ACM新生赛 A,L

为什么要演奏春日影&#xff01;&#xff01;&#xff01; 看到题目所说&#xff0c;若 b i b_i bi​在 i i i 之前&#xff0c;则…,那么很容易联想到拓扑排序&#xff0c;再仔细看题&#xff0c;对于每个 b i b_i bi​,我们都想其对应的 i 进行连边&#xff0c;那么我们很容…

webgoat-client side客户端问题

client side Bypass front-end restrictions 用户对 Web 应用程序的前端有很大程度的控制权。 它们可以更改 HTML 代码&#xff0c;有时也可以更改脚本。这就是为什么 需要特定输入格式的应用也应在服务器端进行验证&#xff0c;而不是只在前端做限制。 0x02 先提交请求&am…

win10虚机扩容C盘

需求&#xff1a; 在虚机管理平台上&#xff0c;将win10虚机的C盘空间扩容至200G&#xff0c;当前空间为100G 操作步骤 1.在虚机平台上&#xff0c;将硬盘1的大小增加至200G 如下图 点击保存&#xff1b; 查看win10虚机&#xff0c;发现C盘空间还是100G&#xff0c;如下图…

使用Redis实现缓存及对应问题解决

一、为什么需要Redis作缓存&#xff1f; 在业务场景中&#xff0c;如果有些数据需要极高频的存取&#xff0c;每次都要在mysql中查询的话代价太大&#xff0c;假如有一个存在于客户端和mysql之间的存储空间&#xff0c;每次可以在这空间中进行存取操作&#xff0c;就会减轻mys…

go程序获取工作目录及可执行程序存放目录的方法-linux

简介 工作目录 通常就是指用户启动应用程序时&#xff0c;用户当时所在的文件夹的绝对路径。 如&#xff1a;root用户登录到linux系统后&#xff0c;一顿cd&#xff08;change directory&#xff09;后, 到了/tmp文件夹下。此时&#xff0c;用户要启动某个应用程序&#xff0…

mediapipe流水线分析 二

目标检测 Graph 一 流水线上游输入处理 1 TfLiteConverterCalculator 将输入的数据转换成tensorflow api 支持的Tensor TfLiteTensor 并初始化相关输入输出节点 &#xff0c;该类的业务主要通过 interpreter std::unique_ptrtflite::Interpreter interpreter_ nullptr; 实现…

Python教程---Python基础语法2

1.变量和字面量(常量) 字面量就是一个一个的值&#xff0c;比如&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;‘HELLO’ 字面量所表示的意思就是它的字面的值&#xff0c;在程序中可以直接使用字面量 变量&#xff08;varia…