有关Spring Boot中使用MongoDB的连接池的解惑,无需重写实现

Spring Boot MongoDB连接池配置与调优实战 数据库连接池是提升应用性能、管理数据库连接资源的核心技术组件。其原理是通过预先建立并维护一定数量的数据库连接,在应用需要时快速分配,使用完毕后回收复用,从而避免频繁创建和销毁连接的开销。这项技术在高并发场景下尤为重要,能显著降低系统延迟、提升吞吐量。在Java生态中,Spring Boot通过自动配置简化了数据库集成的复杂度,而MongoDB Java驱动则内置了高效的连接池实现。对于使用Spring Boot集成MongoDB的开发者而言,理解并正确配置其连接池是保障应用稳定性的关键。本文将深入解析连接池 阅读详情
AI摘要

本文详细介绍了SpringBoot如何通过spring-boot-starter-data-mongodb自动配置连接MongoDB,揭示了MongoDbFactory和MongoClientSettings在连接池配置中的作用。通过ConnectionStringURIFormat,展示了如何在URI中配置连接池选项,如minPoolSize、maxPoolSize等,强调了正确理解和使用URI选项的重要性,避免了不必要的复杂重写。

Spring Boot通过 spring-boot-starter-data-mongodb 自动配置连接MongoDB,spring.data.mongodb 对外暴露的配置项非常少,网上有很多文章说 Spring Boot没有提供连接池配置的功能,需要自行重写 MongoDbFactory,实际这样的确冤枉且小看了 spring-boot-starter-data-mongodb 的内部封装,连接MongoDb的组件当中内置了连接池的方法,只是我们用的姿势不对,并不需要什么重写搞得这么复杂。抱着尊重原创的想法,从其源码入手看看它是如何使用,官方文档也有一些配置,简单的说,MongoDb的连接方式,不是分开的一项一项的配置,学问都在它的uri里,也就是 spring.data.mongodb.uri, 在最后面放着一个option参数,隐秘而深奥,这里就是所有配置的奥妙所在。这个是官方文档,感兴趣的朋友可以看一下

Connection String URI Format — MongoDB Manualhttps://docs.mongodb.com/manual/reference/connection-string/

我们从org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration 自动配置类看起,可以轻易的找到 org.springframework.boot.autoconfigure.mongo.MongoClientFactorySupport<T>, 从这里,又可以找到,com.mongodb.MongoClientSettings, 顺着这里又可以找到,com.mongodb.connection.ConnectionPoolSettings, 那么和连接池相关的设置就在这里了,进入到这个类,很明显就会看到一堆属性

@Immutable
public class ConnectionPoolSettings {
    private final List<ConnectionPoolListener> connectionPoolListeners;
    private final int maxSize;
    private final int minSize;
    private final int maxWaitQueueSize;
    private final long maxWaitTimeMS;
    private final long maxConnectionLifeTimeMS;
    private final long maxConnectionIdleTimeMS;
    private final long maintenanceInitialDelayMS;
    private final long maintenanceFrequencyMS;

所以我们主要考虑这些地方如何才能产生对应的值即可,从com.mongodb.MongoClientSettings.Builder.applyConnectionString(ConnectionString) 这个方法中我们就可以看到            connectionPoolSettingsBuilder.applyConnectionString(connectionString);    

public Builder applyConnectionString(final ConnectionString connectionString) {
            if (connectionString.getApplicationName() != null) {
                applicationName = connectionString.getApplicationName();
            }
            clusterSettingsBuilder.applyConnectionString(connectionString);
            if (!connectionString.getCompressorList().isEmpty()) {
                compressorList = connectionString.getCompressorList();
            }

            ///  !!!这里是设置连接池的重点
            connectionPoolSettingsBuilder.applyConnectionString(connectionString);


            if (connectionString.getCredential() != null) {
                credential = connectionString.getCredential();
            }
            if (connectionString.getReadConcern() != null) {
                readConcern = connectionString.getReadConcern();
            }
            if (connectionString.getReadPreference() != null) {
                readPreference = connectionString.getReadPreference();
            }
            if (connectionString.getRetryWritesValue() != null) {
                retryWrites = connectionString.getRetryWritesValue();
            }
            if (connectionString.getUuidRepresentation() != null) {
                uuidRepresentation = connectionString.getUuidRepresentation();
            }

            serverSettingsBuilder.applyConnectionString(connectionString);
            socketSettingsBuilder.applyConnectionString(connectionString);
            sslSettingsBuilder.applyConnectionString(connectionString);
            if (connectionString.getWriteConcern() != null) {
                writeConcern = connectionString.getWriteConcern();
            }
            return this;
        }

也就是这句话,实现了连接池的设置,那么他是如何设置的呢,只要进去看一看便知,首先他入参的是connectionString, 通过方法如果往调用方的方向反过来一找,便可知道,他就是 spring.data.mongodb.uri 对应的值,那么重点就是我们再重点进去看看里面的方法,其中 com.mongodb.ConnectionString 这个类就是解析连接字符串的重点。在它的带参构造方法中 

com.mongodb.ConnectionString.ConnectionString(String)

除了解析字符串以外,Map<String, List<String>> connectionStringOptionsMap = parseOptions(connectionStringQueryParamenters);

// !!!这句是重点
Map<String, List<String>> connectionStringOptionsMap = parseOptions(connectionStringQueryParamenters);
Map<String, List<String>> txtRecordsOptionsMap = parseOptions(txtRecordsQueryParameters);

 这个方法中用于对 uri中的option进行解析,uri的结构在最尾部会有一个options选项,也就是对参数选项进行解析。通过一系列的解析实现参数设置,真佩服写代码的人不辞辛苦的这种解析精神,换来的是幸福的各种配置,包括连接池,

    static {
        GENERAL_OPTIONS_KEYS.add("minpoolsize");
        GENERAL_OPTIONS_KEYS.add("maxpoolsize");
        GENERAL_OPTIONS_KEYS.add("waitqueuetimeoutms");
        GENERAL_OPTIONS_KEYS.add("connecttimeoutms");
        GENERAL_OPTIONS_KEYS.add("maxidletimems");
        GENERAL_OPTIONS_KEYS.add("maxlifetimems");
        GENERAL_OPTIONS_KEYS.add("sockettimeoutms");

 这里的配置项就是对应的 option里的值,总结来说就是这样的一个对应关系

minConnectionPoolSize; 最小连接池大小                              ---- minPoolSize
maxConnectionPoolSize; 最大连接池大小                             ---- maxPoolSize
maxWaitTime; 最大等待时间                                                  ---- waitQueueTimeoutMS
maxConnectionIdleTime; 最大空闲时间                                 ---- maxIdleTimeMS
maxConnectionLifeTime; 连接池最大生命周期                      ---- maxLifeTimeMS
connectTimeout; 连接超时                                                     ---- connectTimeoutMS
socketTimeout; 读取超时                                                       ---- socketTimeoutMS

如果我们想配置mongoDB的选项,只需要在uri中增加配置内容,否则就会按默认的走

例如我们可以这样配置,实现我们的连接池设置

spring.data.mongodb.uri=mongodb://username:password@192.168.1.1:27017,192.168.1.2:27017,192.168.1.3:27017/?readPreference=secondaryPreferred&maxIdleTimeMS=60000&waitQueueTimeoutMS=2000&minPoolSize=0&maxPoolSize=100&maxLifeTimeMS=0&connectTimeoutMS=2000&socketTimeoutMS=2000

所以以上就是为Spring Boot当中使用mongoDB的组件正名,它并不是没有,也不需要自己实现,应了那句话,生活中不缺少美,缺少的是发现

spring boot 集群连接mongodb 1、pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </d... 阅读详情

相关推荐

Spring Boot集成Spring Data MongoDB实现MongoDB操作

MongoDB从4.0开始支持事务,Spring Data MongoDB也支持事务管理,但需要配置事务管理器。文件中添加Spring Data MongoDB的依赖。:确保MongoDB的版本与Spring Data MongoDB的版本兼容。如果你使用的是Spring Boot 2.x,依赖类似,但版本号会有所不同。注解标注,表示这是一个MongoDB的集合(Collection)。的方法来测试MongoDB的CRUD操作。:如果需要高性能查询,可以在实体类中使用。,并使用它来操作MongoDB。

1290

SpringBoot整合MongoDB连接池(含源码)

jdk 17SpringBoot 3.1.0Mongo 6.0.8mybatis-plus 2.0.2安装教程请查看:一文搞定(linux+windows+docker)安装MongoDB 🌵application.yml配置 参数说明:

Venus's Blog 19万+

Spring boot 使用logback AOP实现HTTP请求日志入MongoDB

Spring boot 使用logback AOP实现HTTP请求日志入MongoDBMongoDB安装与远程访问参考链接–[在ubuntu上安装mongodb] 安装MongoDB 1.1 为软件包管理系统导入公钥 Ubuntu 软件包管理工具为了保证软件包的一致性和可靠性需要用 GPG 密钥检验软件包。使用下列命令导入 MongoDB 的 GPG 密钥 ( MongoD

lin_tuer的博客 2444

mongodb 连接池配置

缩短每次连接删除和关闭之前保持的空闲状态等待时间就可以避免这个问题,但也会造成连接池的频繁连接和关闭。多次测试证实了:超过设置的指定时间后所有线程池的空闲线程连接会被自动关闭,关闭后所有线程池空闲线程会重新连接。不需要在java代码中去写配置类,不需要在java代码中去写配置类,不需要在java代码中去写配置类。所以,mongodb的配置就尽量不要用上面的方式来配,需要使用uri的方式来去配,如果spring使用以下mongodb的配置,则默认是没有连接池的。uri的前半部分:注意符号格式是固定。

qq_46149597的博客 5310

SpringBoot中MongoDB配置及使用方法

Spring Boot 中 MongoDB 配置及使用方法这个系列的文章将会教你如何在 Spring Boot 中配置并使用 MongoDB。本文主要对Spring Boot 中的 MongoDB 配置及使用做一个基础的介绍,并且结合实际案例来详细介绍如何进行连接、增删改查等常用数据库操作。通过这篇文章,你可以了解到 Spring Boot 中 MongoDB 的各种配置项及使用方式,掌握在 Spring Boot 中配置 MongoDB 的方法。

AI天才研究院 3072

Spring Boot如何集成MongoDB?

🏆 本文精选收录于《滚雪球学SpringBoot》专栏,专为零基础学习者量身打造。从Spring基础到项目实战,手把手带你掌握核心技术,助力你快速提升,迈向职场巅峰,开启财富自由之路🚀!无论你是刚入门的小白,还是已有基础的开发者,都能在这里找到适合自己的学习路径!    🌟 关注、收藏、订阅,持续更新中!和我们一起高速成长,突破自我!💡

**My Coding Family** 1174

Springboot Mongodb 连接池配置

Springboot Mongodb 连接池 mongodb连接池以前配置很复杂,需要自己创建client,然后再创建SimpleMongoDbFactory。 但是现在SimpleMongoDbFactory已经标记为Deprecated. 其实在springboot2里已经可以很简单的配置mongodb连接池。 直接上代码,一句话就可以实现。 @Configuration @ConfigurationProperties(prefix = "spring.data.mongodb") pub

吾将上下而求索 2500

基于淘宝商城用户购物行为数据分析系统

本文使用HIve+superset技术对阿里云天池提供的淘宝用户购物数据进行处理分析,得到有价值的信息并对平台提出有建设性意义的意见。

m0_51388399的博客 2819

SpringBoot MongoDB 多数据源连接池配置

SpringBoot MongoDB 多数据源连接池配置

feiyuchuixue的博客 1723

Python与.NET革命性互操作:PythonNet实现零门槛双向调用——深度解析与实战案例

跨语言调用实战指南:Python与.NET深度集成 摘要:本文详解Python与.NET双向互调技术,通过PythonNet和Python.Runtime实现高效跨语言协作。核心优势包括:无缝集成Python机器学习模块(如PaddleOCR)与.NET UI框架,内存直传提升90%数据效率,减少80%重复代码。内容涵盖:1)Python调用.NET类库的完整流程;2)C#动态加载Python脚本及环境配置要点;3)反射机制实现私有方法调用与泛型处理;4)性能优化技巧(类型缓存、NumPy数组转换);5)异

墨夶的博客 611

【PX4学习笔记】1. ROS及PX4环境搭建

环境 Ubuntu18.04 安装教程参考 https://www.guyuehome.com/8983 安装过程中问题的解决 问题1 rosdep init 错误的终极解决方法 注意etc/下的ros和rostep文件夹要自己建 问题2 Ubuntu安装ROS报错 sudo: rosdep:找不到命令 问题3(更好地解决了问题1、2)【推荐】 解决GitHub的raw.githubusercontent.com无法连接问题 问题4:GeographicLib的安装 教程中安装GeographicLib d

【人工智障 | 计算鸡视觉 | 机器孩】 8232

Spring Boot配置MongoDB连接池

  因为Spring Boot中默认没有提供配置MongoDB连接池的属性,所以需要自己向Spring容器中注入mongoDbFactory 1. 添加依赖 &lt;parent&gt;    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;    &lt;artifactId&gt;spring-boot-starter-...

郭大路路 2万+

selenium绕过检测,规避检测

现在不少大网站有对selenium采取了监测机制。比如正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为 undefined或者为false。而使用selenium访问则该值为true。那么如何解决这个问题呢?我们正常浏览器登录查看,window.navigator.webdriver的值为false我们通过selenium打开的网页,测试,可见window.navigator.webdriver的值为true。

景天科技苑 1万+

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

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

张益达的博客 3042

Android 13.0 framework层系统手势增加上滑手势home事件功能(相当于Home键)

在13.0的定制化开发系统手势功能的时候,客户需求要求在上滑手势的时候,在底部上滑时候进入系统桌面,也就是增加 home键功能,所以就需要分析相关的系统手势上滑事件,然后添加home事件这样 就可以实现这个功能了

安卓兼职framework和app工程师的博客 1132

YOLO26改进 - 注意力机制 | MLLAttention (Mamba-Like Linear Attention) 类Mamba线性注意力:动态感受野适配多尺度目标

本文介绍了Mamba-Like Linear Attention (MLLA)模型及其在yolo26中的集成。MLLA结合了Mamba和线性注意力Transformer的优点,线性注意力降低计算复杂度,Mamba有效建模序列。该模型将Mamba的遗忘门和块设计等关键元素与线性注意力结合,还可用位置编码替代遗忘门。我们将MLLA引入yolo26,在检测头的不同尺度特征图上应用。实验表明,改进后的yolo26在目标检测任务中表现良好,体现了MLLA在提升模型性能上的有效性。

魔改工程师的博客 1150

Spring Boot MongoDB自定义连接池配置

在 Spring Boot 应用中使用 MongoDB 时,合理配置连接池可以显著提升数据库访问的性能和稳定性。默认情况下,Spring Data MongoDB 会使用 MongoDB Java 驱动的默认连接池配置,但在生产环境中,我们通常需要根据业务需求自定义参数(如最大连接数、超时时间等)。本文将详细介绍如何在 Spring Boot 中自定义 MongoDB 连接池,适合新手快速上手。:使用监控工具(如 MongoDB 自带的监控工具)来观察连接池的使用情况,及时发现潜在问题。

张小凡 1520

知识图谱-KGE-语义匹配-双线性模型-2018:SimplE

【paper】 SimplE Embedding for Link Prediction in Knowledge Graphs 【简介】 本文是加拿大英属哥伦比亚大学的两位学者发表在 NIPS 2018 上的工作,文章提出了 SimplE(Simple Embedding)。这篇和前面一篇差不多,也是对 1927 年的 CP 进行改进(简化),传统CP为实体分配的两个向量是独立训练的,SimplE利用关系的逆在三元组打分函数中加上了一个对称项,使得每个实体的两个向量依赖学习,并且 SimplE 的复杂度随

u013250861的博客 958

Spring Boot MongoDB连接池:自动装配、核心配置与性能调优实战

连接池是数据库访问层的关键技术,其核心原理是通过复用已建立的TCP连接,避免频繁创建和销毁连接带来的网络握手、身份验证等高昂开销,从而显著提升应用性能与稳定性。在Java生态中,Spring Boot通过自动装配机制,为MongoDB等数据源提供了开箱即用的连接池支持。对于MongoDB而言,其官方Java驱动内置了高效的连接池实现,开发者无需像传统JDBC那样引入第三方库或手动编写池化逻辑。通过配置`maxPoolSize`、`minPoolSize`等参数,即可控制连接数量与生命周期,有效应对高并发场景

weixin_33428613的博客 341

OmniDrive(2):环境搭建

项目中使用的是全量的数据集(full dataset v1.0), 数据量比较大,训练验证(trainval) + test 总计200多G的数据,单独一个个下载会比较慢。参数,否则安装的时候会自动卸载已安装好的torch,重新安装最新版本的torch,这是不允许的。在cuDNN官网下载,默认下载的是最新版本的cuDNN,我们这里点击。,== 博文中详细介绍了完整的cuda和cudnn的安装过程==分析: 这是因为yapf 安装的版本不对,需要安装特定的版本。出现训练的loss变化,就说明可以正常训练了。

@bangbang的博客 623

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spring Boot & MongoDB 实现总结

一、引入数据源配置和依赖 <!-- MongoDb --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency&g...

小熙的博客 5万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring Boot集成MongoDB

springboot集成mongodb 1,先maven中引入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 默认情况下,该依赖并没有像使用MySQL或者Redis那样为我们提供连接池配置的功能。因此,我们需要自行重写

ywn0601的博客 615

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring Boot集成MongoDB教程

本文介绍了SpringBoot集成MongoDB并使用SpringDataMongodb实现文章评论的CRUD操作。主要内容包括:搭建SpringBoot项目并引入spring-boot-starter-data-mongodb依赖,配置MongoDB连接信息,设计评论实体类并创建复合索引,实现Controller和Service层对评论的增删改查功能。通过MongoRepository提供的接口简化了数据库操作,展现了SpringBoot与MongoDB整合的便捷性。

热爱技术、喜欢学习、乐于分享 1379
上一篇: 通过Prometheus利用自定义指标micrometer的MeterRegistry暴露HttpClient连接池中连接数占用状态
下一篇: 卷起来,关于利用MongoDB的CommandListener命令行实现Mongo在Cat中埋点监控
幕紫
博客等级 码龄16年 56粉丝 32原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值