手打不易,如果转摘,请注明出处!
注明原文: 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 自带的监控工具)来观察连接池的使用情况,及时发现潜在问题。
-
避免连接泄漏:确保在代码中正确关闭数据库连接,避免连接泄漏导致连接池耗尽。
-
定期测试和优化:定期对连接池配置进行测试和优化,确保其始终处于最佳状态。