手打不易,如果轉摘,請注明出處!
注明原文: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代碼配置
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 自帶的監控工具)來觀察連接池的使用情況,及時發現潛在問題。
-
避免連接泄漏:確保在代碼中正確關閉數據庫連接,避免連接泄漏導致連接池耗盡。
-
定期測試和優化:定期對連接池配置進行測試和優化,確保其始終處于最佳狀態。