MongoDB中連接池、索引、事務
三分鐘你將學會:
- MongoDB連接池的使用方式與常用參數
- 查詢五步走,能活九十九?
- MongoDB索引與MySQL索引有何異同?
- MongoDB事務與ACID
- 什么是聚合框架?
在最開始接觸MongoDB的時候,是通過 MongoDatabase database = new MongoClient("localhost", 27017).getDatabase("test");
的方式連接MongoDB。
它會為每個請求創(chuàng)建一個新的連接,然后銷毀,一般數據庫的連接都是TCP連接,TCP是長連接,如果不斷開,就會一直連著。
眾所周知,新建一個數據庫連接的代價是很大的,復用現有連接才是首選,連接池就是干這個的。
連接池 = 數據庫連接的緩存
因此當需要新的連接時,就可以復用連接池中緩存的連接了。如果使用得當,連接池可以最大程度的降低數據庫的新連接數量、創(chuàng)建頻率。
可以通過Mongo.get方法獲得DB對象,表示MongoDB數據庫的一個連接。默認情況下,當執(zhí)行完數據庫的查詢操作后,連接將自動回到連接池中,通過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的索引機制和關系型數據庫的索引機制大同小異。
要選擇為哪些字段建索引,可以查看常用的查詢以及那些需要快速執(zhí)行的查詢。
索引基數是指集合中某個字段有多少個不同的值
通常來說,一個字段的基數越高,這個字段上的索引就越有用。這是因為這樣的索引能夠迅速將搜索范圍縮小到一個比較小的結果集。對于基數比較低的字段,索引通常無法排除大量可能的匹配項。
索引可以顯著縮短查詢時間,但是,使用索引也是有代價的,索引字段的增刪改操作會花費更長時間,因為在更改數據時,除了更新文檔數據,MongoDB還必須更新索引。這個和關系型數據庫是一樣的。MongoDB的索引機制和關系型數據庫的索引機制大同小異。
要選擇為哪些字段建索引,可以查看常用的查詢以及那些需要快速執(zhí)行的查詢。
MongoDB內嵌文檔是什么?
MongoDB允許深入文檔內部,對內嵌字段和數組創(chuàng)建索引。內嵌對象和數組字段可以和頂級字段一起在符合索引中使用。
可以在內嵌文檔的鍵上創(chuàng)建索引,方法與在普通鍵上創(chuàng)建索引相同。
在info中的address字段上建立索引。對子文檔創(chuàng)建索引,只有進行與子文檔字段順序完全匹配的查詢時,查詢優(yōu)化器才能使用"address"
上的索引。
MongoDB事務是什么?
事務是數據庫中處理的邏輯單元,包括一個或多個數據庫操作,既可以是讀操作,也可以是寫操作,MongoDB支持跨個多操作、集合、數據庫、文檔和分片的ACID事務。
事務的關鍵:它要么都成功,要么都失敗。
ACID是什么?
ACID是一個事務所需要具備的一組屬性集合。
ACID是原子性atomicity、一致性consistency、隔離性isolation、持久性durability的縮寫。
ACID事務可以確保數據和數據庫狀態(tài)的有效性,即使在出現斷電或其它錯誤的情況下也是如此。
原子性確保了事務中的所有操作要么都被執(zhí)行、要么都不被執(zhí)行。
一致性確??扇绻聞粘晒Γ敲磾祿鞂囊粋€一致性狀態(tài)轉移到下一個一致性狀態(tài)。
隔離性是允許多個事務同時在數據庫中運行的屬性。它保證了一個事務不會查看到任何其它事務的部分結果,這意味著多個事務并行運行于依次運行每個事務所獲得的結果都相同。
持久性確保了在提交事務時,即使系統(tǒng)發(fā)生故障,所有數據也都會保持持久化。
當數據庫滿足所有這些屬性并且只有成功的事務才會被處理時,它就被稱為符合ACID的數據庫。如果在事務完成之前發(fā)生故障,ACID確保不會更改任何數據。
MongoDB是一個分布式數據庫,它支持跨副本集和跨分片的ACID事務。網絡層增加了額外的復雜性。
MongoDB提供了兩種API來使用事務
- 第一種與關系型數據庫類似(如start_transaction和commit_transaction),稱為核心API;
- 第二種稱為回調API,一般推薦使用這種;
核心API不會為大多數錯誤提供重試邏輯,它要求開發(fā)人員為操作、事務提交函數以及所需的任何重試和錯誤邏輯手動編寫代碼。
與核心API不同,回調API提供了一個簡單的函數,該函數封裝了大量的功能,包括啟動與指定邏輯會話關聯(lián)的事務、執(zhí)行作為回調函數提供的函數以及提交事務?;卣{API還提供了處理提交錯誤的重試邏輯。在MongoDB4.2中添加回調API是為了簡化使用事務的應用程序開發(fā),也便于添加處理事務錯誤的應用程序重試邏輯。
核心API和回調API的比較
核心API | 回調API |
---|---|
需要顯示調用才能啟動和提交事務 | 啟動事務、執(zhí)行指定操作,然后提交(可在發(fā)生錯誤前終止) |
不包含TransientTransactionError和UnknowTransactionCommitResult的錯誤處理邏輯,而是提供了為這些錯誤進行自定義處理的靈活性 | 自動為TransientTransactionError和UnknowTransactionCommitResult提供錯誤處理邏輯 |
要求為特定事務將顯式的邏輯會話傳遞給API | 要求為特定事務將顯式的邏輯會話傳遞給API |
聚合框架是什么?
聚合框架是MongoDB中的一組分析工具,可以對一個或多個集合中的文檔進行分析。
聚合框架基于管道的概念,使用聚合管道可以從MongoDB集合獲取輸入,并將該集合中的文檔傳遞到一個或多個階段,每個階段對輸入執(zhí)行不同的操作。每個階段都將之前階段輸出的內容作為輸入。所有階段的輸入和輸出都是文檔,可以稱為文檔流。
每個階段都會提供一組按鈕或可調參數,可以通過控制它們來設置該階段的參數,以執(zhí)行各種任務。
這些可調參數通常采用運算符的形式,可以使用這些運算符來修改字段、執(zhí)行算術運算、調整文檔形狀、執(zhí)行各種累加任務或其它各種操作。
常見的聚合管道包括匹配match、投射project、排序sort、跳過skip、限制limit。
到此這篇關于MongoDB中連接池、索引、事務的文章就介紹到這了,更多相關MongoDB中連接池、索引、事務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MongoDB詭異問題之sh.stopBalancer卡住的解決方法
這篇文章主要給大家介紹了關于MongoDB詭異問題之sh.stopBalancer卡住解決的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-03-03Windows系統(tǒng)啟動MongoDB報錯無法連接服務器的問題及解決方案
在Windows系統(tǒng)中啟動MongoDB時遇到連接拒絕的錯誤,通常是因為服務未運行或配置問題,本文給大家分享Windows系統(tǒng)啟動MongoDB報錯無法連接服務器的問題及解決方案,一起看看吧2024-10-10