聊聊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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...