Spring Boot MongoDB自定义连接池配置

手打不易,如果转摘,请注明出处!

注明原文: http://zhangxiaofan.blog.csdn.net/article/details/144341407


一、引言

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

二、环境准备

技术版本

  • Spring Boot 2.x.x
  • MongoDB 3.x(Spring Data MongoDB 自动依赖)
  • MongoDB 服务(本地或远程,版本 >= 4.0)

依赖配置

pom.xml 中添加 MongoDB 依赖(Spring Boot 起步依赖会自动包含驱动):

复制代码
<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-data-mongodb</artifactId>  
</dependency>  

三、核心参数

1. 连接池大小参数

参数名 作用 推荐值(生产环境)
maxConnectionPoolSize 单个主机的最大连接数,超过时请求排队 根据业务并发量调整,一般 50-200
minConnectionPoolSize 保持的最小空闲连接数,减少新建连接开销 5-20(视访问频率)

2. 超时参数

参数名 作用 推荐值
connectTimeoutMS 建立连接的超时时间 10-30 秒
socketTimeoutMS 读写数据的超时时间(0 表示不超时) 30-60 秒
serverSelectionTimeoutMS 选择可用服务器的超时(如副本集切换) 5-15 秒

四、配置连接池

1.properties配置

复制代码
# application.yml示例  
spring:  
  data:  
    mongodb:  
      uri: mongodb://username:password@localhost:27017/databaseName  
      # 连接池参数  
      connection-timeout: 5000  # 连接超时时间(毫秒)  
      max-wait-time: 1000       # 等待连接的最大时间(毫秒)  
      max-inactive: 60000       # 连接空闲超时时间(毫秒)  
      max-size: 50              # 最大连接数  
      min-size: 10              # 最小连接数  
      threads-allowed-to-block-multiplier: 5  # 允许阻塞的线程数乘数  

2.连接串配置

复制代码
spring.data.mongodb.uri=mongodb://user:password@host:port/database?maxPoolSize=50&minPoolSize=5&connectTimeoutMS=15000&socketTimeoutMS=30000&serverSelectionTimeoutMS=20000  

3.Java代码配置

java 复制代码
import com.mongodb.ConnectionString;  
import com.mongodb.MongoClientSettings;  
import com.mongodb.client.MongoClient;  
import com.mongodb.client.MongoClients;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration;  

@Configuration  
public class MongoConfig extends AbstractMongoClientConfiguration {  

    private final String databaseName = "your_database";  
    private final String connectionUri = "mongodb://host:port";  

    @Override  
    protected String getDatabaseName() {  
        return databaseName;  
    }  

    @Override  
    @Bean  
    public MongoClient mongoClient() {  
        // 解析连接字符串  
        ConnectionString connectionString = new ConnectionString(connectionUri);  
        // 构建连接池配置  
        MongoClientSettings settings = MongoClientSettings.builder()  
            .applyConnectionString(connectionString)  
            // 自定义连接池参数  
            .maxConnectionPoolSize(50)          // 最大连接数  
            .minConnectionPoolSize(5)           // 最小空闲连接数  
            .connectTimeout(Duration.ofMillis(15000))  // 连接超时  
            .socketTimeout(Duration.ofMillis(30000))   // 套接字超时  
            .serverSelectionTimeout(Duration.ofMillis(20000)) // 服务器选择超时  
            // 其他配置:SSL、认证、负载均衡策略等  
            .sslEnabled(false)                   // 是否启用 SSL  
            .build();  
        return MongoClients.create(settings);  
    }  
}  

五、查看是否生效

六、实践建议

  • 生产环境建议通过JVM监控工具(如Prometheus+Grafana)持续跟踪连接池状态。

  • 根据业务流量波动,动态调整连接池参数(如高峰期增大max-size

  • 根据业务需求调整参数:不同的业务场景对连接池的需求不同,需要根据实际负载进行调整。

  • 监控连接池状态:使用监控工具(如 MongoDB 自带的监控工具)来观察连接池的使用情况,及时发现潜在问题。

  • 避免连接泄漏:确保在代码中正确关闭数据库连接,避免连接泄漏导致连接池耗尽。

  • 定期测试和优化:定期对连接池配置进行测试和优化,确保其始终处于最佳状态。

相关推荐
Configure-Handler29 分钟前
buildroot System configuration
java·服务器·数据库
:Concerto1 小时前
JavaSE 注解
java·开发语言·sprint
电商API_180079052472 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
一点程序2 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
C雨后彩虹2 小时前
计算疫情扩散时间
java·数据结构·算法·华为·面试
2601_949809592 小时前
flutter_for_openharmony家庭相册app实战+我的Tab实现
java·javascript·flutter
vx_BS813302 小时前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计
2601_949868362 小时前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
达文汐3 小时前
【困难】力扣算法题解析LeetCode332:重新安排行程
java·数据结构·经验分享·算法·leetcode·力扣
培风图南以星河揽胜3 小时前
Java版LeetCode热题100之零钱兑换:动态规划经典问题深度解析
java·leetcode·动态规划