聊聊MongoDB中連接池、索引、事務

来源:https://www.cnblogs.com/nezhaSoft/archive/2023/01/10/17041714.html
-Advertisement-
Play Games

大家好,我是哪吒。 三分鐘你將學會: MongoDB連接池的使用方式與常用參數 查詢五步走,能活九十九? MongoDB索引與MySQL索引有何異同? MongoDB事務與ACID 什麼是聚合框架? 在最開始接觸MongoDB的時候,是通過 MongoDatabase database = new ...


大家好,我是哪吒。

三分鐘你將學會:

  1. MongoDB連接池的使用方式與常用參數
  2. 查詢五步走,能活九十九?
  3. MongoDB索引與MySQL索引有何異同?
  4. MongoDB事務與ACID
  5. 什麼是聚合框架?

在最開始接觸MongoDB的時候,是通過 MongoDatabase database = new MongoClient("localhost", 27017).getDatabase("test"); 的方式連接MongoDB。

它會為每個請求創建一個新的連接,然後銷毀,一般資料庫的連接都是TCP連接,TCP是長連接,如果不斷開,就會一直連著。

眾所周知,新建一個資料庫連接的代價是很大的,復用現有連接才是首選,連接池就是乾這個的。

連接池 = 資料庫連接的緩存

因此當需要新的連接時,就可以復用連接池中緩存的連接了。如果使用得當,連接池可以最大程度的降低資料庫的新連接數量、創建頻率。

可以通過Mongo.get方法獲得DB對象,表示MongoDB資料庫的一個連接。預設情況下,當執行完資料庫的查詢操作後,連接將自動回到連接池中,通過api中的finally方法,將連接歸還給連接池,不需要手動調用。

MongoDB查詢數據五步走

  1. MongoDB Client需要找到可用的MongoDB;
  2. Server MongoDB Client需要和 MongoDB Server建立 Connection;
  3. 應用程式處理線程從 Connection Pool中獲取 Connection;
  4. 數據傳輸(獲取連接後,進行 Socket 通信,獲取數據);
  5. 斷開 Collection;

MongoDB連接池的參數配置

#線程池允許的最大連接數
connectionsPerHost: 40
#線程池中連接的最大空閑時間
threadsAllowedToBlockForConnectionMultiplier: 20
#1、MongoDB Client需要找到可用的MongoDB Server所需要的等待時間
serverSelectionTimeout: 40000
#2、MongoDB Client需要和MongoDB Server建立(new)Connection
connectTimeout: 60000
#3、應用程式處理線程從Connection Pool中獲取Connection
maxWaitTime: 120000
#自動重連
autoConnectRetry: true
#socket是否保活
socketKeepAlive: true
#4、數據傳輸(獲取連接後,進行Socket通信,獲取數據)
socketTimeout: 30000
slaveOk: true
dbName: ngo
#是否進行許可權驗證
auth: false
#用戶名
username: ngo
#密碼
password: 12345678

下麵簡單說一下MongoDB的索引

索引可以顯著縮短查詢時間,但是,使用索引也是有代價的,索引欄位的增刪改操作會花費更長時間,因為在更改數據時,除了更新文檔數據,MongoDB還必須更新索引。這個和關係型資料庫是一樣的。MongoDB的索引機制和關係型資料庫的索引機制大同小異。

要選擇為哪些欄位建索引,可以查看常用的查詢以及那些需要快速執行的查詢。

索引基數是指集合中某個欄位有多少個不同的值

通常來說,一個欄位的基數越高,這個欄位上的索引就越有用。這是因為這樣的索引能夠迅速將搜索範圍縮小到一個比較小的結果集。對於基數比較低的欄位,索引通常無法排除大量可能的匹配項。

索引可以顯著縮短查詢時間,但是,使用索引也是有代價的,索引欄位的增刪改操作會花費更長時間,因為在更改數據時,除了更新文檔數據,MongoDB還必須更新索引。這個和關係型資料庫是一樣的。MongoDB的索引機制和關係型資料庫的索引機制大同小異。

要選擇為哪些欄位建索引,可以查看常用的查詢以及那些需要快速執行的查詢。

MongoDB內嵌文檔是什麼?

MongoDB允許深入文檔內部,對內嵌欄位和數組創建索引。內嵌對象和數組欄位可以和頂級欄位一起在符合索引中使用。

可以在內嵌文檔的鍵上創建索引,方法與在普通鍵上創建索引相同。

在info中的address欄位上建立索引。對子文檔創建索引,只有進行與子文檔欄位順序完全匹配的查詢時,查詢優化器才能使用"address"上的索引。

MongoDB事務是什麼?

事務是資料庫中處理的邏輯單元,包括一個或多個資料庫操作,既可以是讀操作,也可以是寫操作,MongoDB支持跨個多操作、集合、資料庫、文檔和分片的ACID事務。

事務的關鍵:它要麼都成功,要麼都失敗。

ACID是什麼?

ACID是一個事務所需要具備的一組屬性集合。

ACID是原子性atomicity、一致性consistency、隔離性isolation、持久性durability的縮寫。

ACID事務可以確保數據和資料庫狀態的有效性,即使在出現斷電或其它錯誤的情況下也是如此。

原子性確保了事務中的所有操作要麼都被執行、要麼都不被執行。

一致性確保可如果事務成功,那麼資料庫將從一個一致性狀態轉移到下一個一致性狀態。

隔離性是允許多個事務同時在資料庫中運行的屬性。它保證了一個事務不會查看到任何其它事務的部分結果,這意味著多個事務並行運行於依次運行每個事務所獲得的結果都相同。

持久性確保了在提交事務時,即使系統發生故障,所有數據也都會保持持久化。

當資料庫滿足所有這些屬性並且只有成功的事務才會被處理時,它就被稱為符合ACID的資料庫。如果在事務完成之前發生故障,ACID確保不會更改任何數據。

MongoDB是一個分散式資料庫,它支持跨副本集和跨分片的ACID事務。網路層增加了額外的複雜性。

MongoDB提供了兩種API來使用事務

  • 第一種與關係型資料庫類似(如start_transaction和commit_transaction),稱為核心API;
  • 第二種稱為回調API,一般推薦使用這種;

核心API不會為大多數錯誤提供重試邏輯,它要求開發人員為操作、事務提交函數以及所需的任何重試和錯誤邏輯手動編寫代碼。

與核心API不同,回調API提供了一個簡單的函數,該函數封裝了大量的功能,包括啟動與指定邏輯會話關聯的事務、執行作為回調函數提供的函數以及提交事務。回調API還提供了處理提交錯誤的重試邏輯。在MongoDB4.2中添加回調API是為了簡化使用事務的應用程式開發,也便於添加處理事務錯誤的應用程式重試邏輯。

核心API和回調API的比較

核心API 回調API
需要顯示調用才能啟動和提交事務 啟動事務、執行指定操作,然後提交(可在發生錯誤前終止)
不包含TransientTransactionError和UnknowTransactionCommitResult的錯誤處理邏輯,而是提供了為這些錯誤進行自定義處理的靈活性 自動為TransientTransactionError和UnknowTransactionCommitResult提供錯誤處理邏輯
要求為特定事務將顯式的邏輯會話傳遞給API 要求為特定事務將顯式的邏輯會話傳遞給API

聚合框架是什麼?

聚合框架是MongoDB中的一組分析工具,可以對一個或多個集合中的文檔進行分析。

聚合框架基於管道的概念,使用聚合管道可以從MongoDB集合獲取輸入,並將該集合中的文檔傳遞到一個或多個階段,每個階段對輸入執行不同的操作。每個階段都將之前階段輸出的內容作為輸入。所有階段的輸入和輸出都是文檔,可以稱為文檔流。

每個階段都會提供一組按鈕或可調參數,可以通過控制它們來設置該階段的參數,以執行各種任務。

這些可調參數通常採用運算符的形式,可以使用這些運算符來修改欄位、執行算術運算、調整文檔形狀、執行各種累加任務或其它各種操作。

常見的聚合管道包括匹配match、投射project、排序sort、跳過skip、限制limit。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2023-01-09 一、在IDEA中創建Maven版的web工程 (1)步驟: ①創建一個maven模塊,命名為“maven_web_end”,之後需要創建web工程的目錄。在“maven_web_end.src.main”下創建“webapp”文件夾(命名必須為webapp,否則識別不了);在“ ...
  • 作者:小牛呼嚕嚕 | https://xiaoniuhululu.com 電腦內功、JAVA底層、面試相關資料等更多精彩文章在公眾號「小牛呼嚕嚕 」 大家好,我是呼嚕嚕,這次我們一起來看看Java記憶體區域,本文 基於HotSpot 虛擬機,JDK8, 乾貨滿滿 前言 Java 記憶體區域, 也叫運行 ...
  • Excelize 是 Go 語言編寫的用於操作 Office Excel 文檔基礎庫,支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多種文檔格式。2023年1月9日,社區正式發佈了 2.7.0 版本,該版本包含了多項新增功能、錯誤修複和相容性提升優化。 ...
  • ThreadLocal是一個關於創建線程局部變數的類。 通常情況下,我們創建的變數是可以被任何一個線程訪問並修改的。而使用ThreadLocal創建的變數只能被當前線程訪問,其他線程則無法訪問和修改。ThreadLocal在設計之初就是為解決併發問題而提供一種方案,每個線程維護一份自己的數據,達到線... ...
  • 移動滑鼠到你想要的位置,然後進行點擊,某些時候是很有用的 using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; private void button ...
  • 1 ansible 常用指令總結,並附有相關示例。 /usr/bin/ansible 主程式,臨時命令執行工具 /usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具,相當於man /usr/bin/ansible-playbook 定製自動化任務,編排劇本工具,相當於腳本 /us ...
  • select/poll/epoll 是 Linux 伺服器提供的三種處理高併發網路請求的 IO 多路復用技術,是個老生常談又不容易弄清楚其底層原理的知識點,本文打算深入學習下其實現機制。 Linux 伺服器處理網路請求有三種機制,select、poll、epoll,本文打算深入學習下其實現原理。 ... ...
  • 病情描述 打開Ubuntu準備工作,結果黑屏,等了一會(幾分鐘),通過ssh連上,使用df -h查看磁碟占用,發現/var目錄空間被占滿了,上圖: 病情分析 先top查看資源占用,如下圖所示: 這不,病竈找到了,cupsd乾的好事,cpu直接拉滿!問題來了,cupsd是個什麼玩意?百度百科描述如下: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...