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代碼配置

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 自帶的監控工具)來觀察連接池的使用情況,及時發現潛在問題。

  • 避免連接泄漏:確保在代碼中正確關閉數據庫連接,避免連接泄漏導致連接池耗盡。

  • 定期測試和優化:定期對連接池配置進行測試和優化,確保其始終處于最佳狀態。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900979.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900979.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900979.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Tabnet介紹(Decision Manifolds)和PyTorch TabNet之TabNetRegressor

Tabnet介紹&#xff08;Decision Manifolds&#xff09;和PyTorch TabNet之TabNetRegressor Decision ManifoldsTabNet1.核心思想2. 架構組成3. 工作流程4. 優點 PyTorch TabNetTabNetRegressor參數1. 模型相關參數n_dn_an_stepsgammacat_idxscat_dimscat_emb_dim 2. 訓練相關參…

圖像變換方式區別對比(Opencv)

1. 變換示例 import cv2 import matplotlib.pyplot as plotimg cv2.imread(url) img_cut img[100:200, 200:300] img_rsize cv2.resize(img, (50, 50)) (hight,width) img.shape[:2] rotate_matrix cv2.getRotationMatrix2D((hight//2, width//2), 50, 1) img_wa cv2.wa…

Navicat分組、查詢分享

1、分組 有些項目業務表比較多&#xff0c;多達幾百張&#xff0c;如果通過人眼看&#xff0c;很容易頭暈。這時候可以通過Navicat表分組來進行分類。 使用場景 按版本分組按業務功能分組 創建分組 示例&#xff1a;按版本分組&#xff0c;可以將1.0版本的表放到1.0中。 分組…

大模型在初治CLL成人患者診療全流程風險預測與方案制定中的應用研究

目錄 一、緒論 1.1 研究背景與意義 1.2 國內外研究現狀 1.3 研究目的與內容 二、大模型技術與慢性淋巴細胞白血病相關知識 2.1 大模型技術原理與特點 2.2 慢性淋巴細胞白血病的病理生理與診療現狀 三、術前風險預測與手術方案制定 3.1 術前數據收集與預處理 3.2 大模…

for循環的優化方式、循環的種類、使用及平替方案。

本篇文章主要圍繞for循環,來講解循環處理數據中常見的六種方式及其特點,性能。通過本篇文章你可以快速了解循環的概念,以及循環在實際使用過程中的調優方案。 作者:任聰聰 日期:2025年4月11日 一、循環的種類 1.1 默認有以下類型 原始 for 循環 for(i = 0;i<10;i++){…

穿透三層內網VPC1

網絡拓撲: 打開入口web服務 信息收集發現漏洞CVE-2024-4577 PHP CGI Windows平臺遠程代碼執行漏洞&#xff08;CVE-2024-4577&#xff09;復現_cve-2024-4577漏洞復現-CSDN博客 利用POC&#xff1a; 執行成功&#xff0c;那么直接上傳馬子&#xff0c;注意&#xff0c;這里要…

【計算機網絡】同步操作 vs 異步操作:核心區別與實戰場景解析

&#x1f4cc; 引言 在網絡通信和分布式系統中&#xff0c;**同步&#xff08;Synchronous&#xff09;和異步&#xff08;Asynchronous&#xff09;**是兩種基礎卻易混淆的操作模式。本文將通過代碼示例、生活類比和對比表格&#xff0c;幫你徹底理解它們的區別與應用場景。 1…

TensorFlow充分并行化使用CPU

關鍵字&#xff1a;TensorFlow 并行化、TensorFlow CPU多線程 場景&#xff1a;在沒有GPU或者GPU性能一般、環境不可用的機器上&#xff0c;對于多核CPU&#xff0c;有時TensorFlow或上層的Keras默認并沒有完全利用機器的計算能力&#xff08;CPU占用沒有接近100%&#xff09;…

Kubernetes容器編排與云原生實踐

第一部分&#xff1a;Kubernetes基礎架構與核心原理 第1章 容器技術的演進與Kubernetes的誕生 1.1 虛擬化技術的三次革命 物理機時代&#xff1a;資源浪費嚴重&#xff0c;利用率不足15% 虛擬機突破&#xff1a;VMware與Hyper-V實現硬件虛擬化&#xff0c;利用率提升至50% …

Windows 錄音格式為什么是 M4A?M4A 怎樣轉為 MP3 格式

M4A 格式憑借其高效的壓縮技術和卓越的音質表現脫穎而出&#xff0c;成為了包括 Windows 在內的眾多操作系統默認的錄音格式選擇。然而&#xff0c;盡管 M4A 格式擁有諸多優點&#xff0c;不同的應用場景有時需要將這些文件轉換為其他格式以滿足特定需求。 本文將探討 M4A 格式…

Qt之OpenGL使用Qt封裝好的著色器和編譯器

代碼 #include "sunopengl.h"sunOpengl::sunOpengl(QWidget *parent) {}unsigned int VBO,VAO; float vertices[]{0.5f,0.5f,0.0f,0.5f,-0.5f,0.0f,-0.5f,-0.5f,0.0f,-0.5f,0.5f,0.0f };unsigned int indices[]{0,1,3,1,2,3, }; unsigned int EBO; sunOpengl::~sunO…

HCIP-17 BGP基礎2

HCIP-17 BGP基礎2 一、bgp的路由黑洞問題 1.bgp的同步功能 ipv4-family unicast IPV4的地址簇 undo synchronization 關閉BGP同步功能 bgp的同步功能原理 當邊界路由器從ibgp鄰居收到一條路由后&#xff0c;會使用該路由和igp路由表進行比較。 如果在igp路由表中存在…

leetcode_15. 三數之和_java

15. 三數之和https://leetcode.cn/problems/3sum/ 1、題目 給你一個整數數組 nums &#xff0c;判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k &#xff0c;同時還滿足 nums[i] nums[j] nums[k] 0 。請你返回所有和為 0 且不重復的三元組。…

Open Interpreter:重新定義人機交互的開源革命

引言 在人工智能技術蓬勃發展的今天&#xff0c;人機交互的方式正經歷著前所未有的變革。Open Interpreter&#xff0c;作為一個開源項目&#xff0c;正在重新定義我們與計算機的互動方式。它允許大型語言模型&#xff08;LLMs&#xff09;在本地運行代碼&#xff0c;通過自然…

【JavaScript】錯誤處理與調試

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;HTML CSS JavaScript 文章目錄 1. JavaScript 錯誤處理基礎1.1 錯誤類型1.2 try...catch 語句 2. 錯誤拋出與自定義錯誤2.1 throw 語句2.2 自定義錯誤類型 3. 異步錯誤處理3.1 Promise 錯誤處理3.2 async/await 錯誤處理 4. 調試…

算法基礎模板

高精度加法 #include <bits/stdc.h> using namespace std; const int N10005; int A[N],B[N],C[N],al,bl,cl; void add(int A[],int B[],int C[]) {for(int icl-1;~i;i--){C[cl]A[i]B[i];C[cl1]C[cl]/10;C[cl]%10;}if(C[cl])cl; } int main() {string a,b;cin>>a&…

自行搭建一個Git倉庫托管平臺

1.安裝Git sudo apt install git 2.Git本地倉庫創建&#xff08;自己選擇一個文件夾&#xff09; git init 這里我在 /home/test 下面初始化了代碼倉庫 1. 首先在倉庫中新建一個txt文件&#xff0c;并輸入一些內容 2. 將文件添加到倉庫 git add test.txt 執行之后沒有任何輸…

[MySQL]數據庫與表創建

歡迎來到啾啾的博客&#x1f431;。 這是一個致力于構建完善 Java 程序員知識體系的博客&#x1f4da;。 它記錄學習點滴&#xff0c;分享工作思考和實用技巧&#xff0c;偶爾也分享一些雜談&#x1f4ac;。 歡迎評論交流&#xff0c;感謝您的閱讀&#x1f604;。 本篇簡單記錄…

相機回調函數為靜態函數原因

在注冊相機SDK的回調函數時&#xff0c;是否需要設置為靜態函數取決于具體SDK的設計要求&#xff0c;但通常需要遵循以下原則&#xff1a; 1. 必須使用靜態函數的情況 當相機SDK是C語言接口或要求普通函數指針時&#xff0c;回調必須聲明為靜態成員函數或全局函數&#xff1a;…

《Vue Router實戰教程》4.路由的匹配語法

歡迎觀看《Vue Router 實戰&#xff08;第4版&#xff09;》視頻課程 路由的匹配語法 大多數應用都會使用 /about 這樣的靜態路由和 /users/:userId 這樣的動態路由&#xff0c;就像我們剛才在動態路由匹配中看到的那樣&#xff0c;但是 Vue Router 可以提供更多的方式&#…