日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

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

作者:哪吒編程 ? 更新時間: 2023-02-26 編程語言

三分鐘你將學會:

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

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

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

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

連接池 = 數據庫連接的緩存

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

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

MongoDB查詢數據五步走

  • MongoDB Client需要找到可用的MongoDB;
  • Server MongoDB Client需要和 MongoDB Server建立 Connection;
  • 應用程序處理線程從 Connection Pool中獲取 Connection;
  • 數據傳輸(獲取連接后,進行 Socket 通信,獲取數據);
  • 斷開 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。

原文鏈接:https://www.cnblogs.com/nezhaSoft/p/17041714.html

欄目分類
最近更新