MongoDB Java 驅動內建連接池,合理配置對性能至關重要。本文涵蓋連接池核心參數、配置模板、監控指標、常見問題與最佳實踐,基於 MongoDB Java Driver 4.x (Sync API)。
| 參數 | 默認值 | 建議值/說明 |
| maxPoolSize | 100 | 根據業務併發調整,公式:max(100, CPU核數 * 5),上限 500 避免連接風暴 |
| minPoolSize | 0 | 生產建議 10-20,預熱連接減少首次請求延遲 |
| maxIdleTimeMS | 0 (無限) | 300000 (5分鐘),釋放閒置連接防資源洩漏 |
| waitQueueTimeoutMS | 120000 | 5000-10000,快速失敗避免請求堆積 |
| connectTimeoutMS | 10000 | 5000,快速發現網絡故障 |
| socketTimeoutMS | 0 (無限) | 30000,防止慢查詢佔用連接 |
| serverSelectionTimeoutMS | 30000 | 10000,快速切換主節點 |
完整配置代碼
import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.codecs.pojo.PojoCodecProvider;
import static org.bson.codecs.configuration.CodecRegistries.*;
public class MongoPoolConfig {
public static MongoClient createClient(String uri) {
CodecRegistry pojoRegistry = fromRegistries(
MongoClientSettings.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().automatic(true).build())
);
MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString(uri))
.codecRegistry(pojoRegistry)
.applyToConnectionPoolSettings(builder -> builder
.maxSize(200)
.minSize(20)
.maxWaitTime(5, TimeUnit.SECONDS)
.maxConnectionLifeTime(30, TimeUnit.MINUTES)
.maxConnectionIdleTime(5, TimeUnit.MINUTES)
.maintenanceFrequency(1, TimeUnit.MINUTES)
.maintenanceInitialDelay(1, TimeUnit.MINUTES)
)
.applyToSocketSettings(builder -> builder
.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
)
.applyToClusterSettings(builder -> builder
.serverSelectionTimeout(10, TimeUnit.SECONDS)
.mode(ClusterSettings.Mode.MULTIPLE) // 副本集
)
.retryWrites(true)
.retryReads(true)
.build();
return MongoClients.create(settings);
}
}
Spring Boot 整合配置
# application.yml
spring:
data:
mongodb:
uri: mongodb://user:pass@host1:27017,host2:27017/db?replicaSet=rs0
auto-index-creation: true
mongodb:
client-settings:
connections-per-host: 200
min-connections-per-host: 20
max-wait-time: 5000
connect-timeout: 5000
socket-timeout: 30000
server-selection-timeout: 10000
關鍵監控指標
- 連接池使用率:
currentInUse / maxPoolSize,持續 > 80% 需擴容或優化查詢。
- 等待佇列長度:
waitQueueSize,非零說明連接不足。
- 連接創建/關閉頻率:頻繁波動說明 minPoolSize 過小或 maxIdleTime 過短。
- 慢查詢佔用連接:結合
socketTimeout 與 Profiler 定位。
可通過 MongoClient.getCluster().getDescription() 或 Micrometer/Prometheus 導出監控。
常見問題與對策
| 現象 | 原因 | 對策 |
| 連接洩漏 (連接數只增不減) | 未關閉 Cursor、未釋放 ClientSession、驅動 Bug | try-with-resources 管理 Cursor/Session;升級驅動;設置 maxConnectionLifeTime |
| 頻繁「連接超時」 | 網絡抖動、防火牆斷開閒置連接、maxIdleTime 過長 | 啟用 keepAlive (驅動默認);縮短 maxIdleTime;檢查網絡設備超時設置 |
| 主節點切換後報錯 | 舊連接指向舊主節點,驅動未及時刷新 | 啟用 retryWrites/retryReads;縮短 serverSelectionTimeout;確保副本集心跳正常 |
| 連接池耗盡導致業務卡死 | 慢查詢佔用連接、併發峰值超過 maxPoolSize | 設置 waitQueueTimeout 快速失敗;優化索引;限流;擴容 maxPoolSize |
最佳實踐清單
- 單例 MongoClient:全應用共享一個實例,JVM 關閉時調用
close()。
- 合理設置超時:連接/讀/寫/選主超時分離配置,避免無限等待。
- 啟用重試:
retryWrites=true、retryReads=true (4.2+),提升可用性。
- 使用 PojoCodec:自動映射 Java Bean,減少手動 Document 構建。
- 監控告警:接入 Prometheus + Grafana,關鍵指標設置閾值告警。
- 定期滾動升級驅動:修復 Bug、性能優化、新功能支援。
- 上一篇文章: Java 圖片添加水印完整實戰:文字水印、圖片水印、旋轉、透明度與批量處理
- 下一篇文章: Java Web 開發中 HttpServletRequest 核心方法詳解與實戰範例
Copyright ©
程式碼之家 All Rights Reserved