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