MongoDB中連接池、索引、事務(wù)
三分鐘你將學(xué)會(huì):
- MongoDB連接池的使用方式與常用參數(shù)
- 查詢五步走,能活九十九?
- MongoDB索引與MySQL索引有何異同?
- MongoDB事務(wù)與ACID
- 什么是聚合框架?
在最開(kāi)始接觸MongoDB的時(shí)候,是通過(guò) MongoDatabase database = new MongoClient("localhost", 27017).getDatabase("test");
的方式連接MongoDB。
它會(huì)為每個(gè)請(qǐng)求創(chuàng)建一個(gè)新的連接,然后銷毀,一般數(shù)據(jù)庫(kù)的連接都是TCP連接,TCP是長(zhǎng)連接,如果不斷開(kāi),就會(huì)一直連著。
眾所周知,新建一個(gè)數(shù)據(jù)庫(kù)連接的代價(jià)是很大的,復(fù)用現(xiàn)有連接才是首選,連接池就是干這個(gè)的。
連接池 = 數(shù)據(jù)庫(kù)連接的緩存
因此當(dāng)需要新的連接時(shí),就可以復(fù)用連接池中緩存的連接了。如果使用得當(dāng),連接池可以最大程度的降低數(shù)據(jù)庫(kù)的新連接數(shù)量、創(chuàng)建頻率。
可以通過(guò)Mongo.get方法獲得DB對(duì)象,表示MongoDB數(shù)據(jù)庫(kù)的一個(gè)連接。默認(rèn)情況下,當(dāng)執(zhí)行完數(shù)據(jù)庫(kù)的查詢操作后,連接將自動(dòng)回到連接池中,通過(guò)api中的finally方法,將連接歸還給連接池,不需要手動(dòng)調(diào)用。
MongoDB查詢數(shù)據(jù)五步走
- MongoDB Client需要找到可用的MongoDB;
- Server MongoDB Client需要和 MongoDB Server建立 Connection;
- 應(yīng)用程序處理線程從 Connection Pool中獲取 Connection;
- 數(shù)據(jù)傳輸(獲取連接后,進(jìn)行 Socket 通信,獲取數(shù)據(jù));
- 斷開(kāi) Collection;
MongoDB連接池的參數(shù)配置
#線程池允許的最大連接數(shù) connectionsPerHost: 40 #線程池中連接的最大空閑時(shí)間 threadsAllowedToBlockForConnectionMultiplier: 20 #1、MongoDB Client需要找到可用的MongoDB Server所需要的等待時(shí)間 serverSelectionTimeout: 40000 #2、MongoDB Client需要和MongoDB Server建立(new)Connection connectTimeout: 60000 #3、應(yīng)用程序處理線程從Connection Pool中獲取Connection maxWaitTime: 120000 #自動(dòng)重連 autoConnectRetry: true #socket是否?;? socketKeepAlive: true #4、數(shù)據(jù)傳輸(獲取連接后,進(jìn)行Socket通信,獲取數(shù)據(jù)) socketTimeout: 30000 slaveOk: true dbName: ngo #是否進(jìn)行權(quán)限驗(yàn)證 auth: false #用戶名 username: ngo #密碼 password: 12345678
下面簡(jiǎn)單說(shuō)一下MongoDB的索引
索引可以顯著縮短查詢時(shí)間,但是,使用索引也是有代價(jià)的,索引字段的增刪改操作會(huì)花費(fèi)更長(zhǎng)時(shí)間,因?yàn)樵诟臄?shù)據(jù)時(shí),除了更新文檔數(shù)據(jù),MongoDB還必須更新索引。這個(gè)和關(guān)系型數(shù)據(jù)庫(kù)是一樣的。MongoDB的索引機(jī)制和關(guān)系型數(shù)據(jù)庫(kù)的索引機(jī)制大同小異。
要選擇為哪些字段建索引,可以查看常用的查詢以及那些需要快速執(zhí)行的查詢。
索引基數(shù)是指集合中某個(gè)字段有多少個(gè)不同的值
通常來(lái)說(shuō),一個(gè)字段的基數(shù)越高,這個(gè)字段上的索引就越有用。這是因?yàn)檫@樣的索引能夠迅速將搜索范圍縮小到一個(gè)比較小的結(jié)果集。對(duì)于基數(shù)比較低的字段,索引通常無(wú)法排除大量可能的匹配項(xiàng)。
索引可以顯著縮短查詢時(shí)間,但是,使用索引也是有代價(jià)的,索引字段的增刪改操作會(huì)花費(fèi)更長(zhǎng)時(shí)間,因?yàn)樵诟臄?shù)據(jù)時(shí),除了更新文檔數(shù)據(jù),MongoDB還必須更新索引。這個(gè)和關(guān)系型數(shù)據(jù)庫(kù)是一樣的。MongoDB的索引機(jī)制和關(guān)系型數(shù)據(jù)庫(kù)的索引機(jī)制大同小異。
要選擇為哪些字段建索引,可以查看常用的查詢以及那些需要快速執(zhí)行的查詢。
MongoDB內(nèi)嵌文檔是什么?
MongoDB允許深入文檔內(nèi)部,對(duì)內(nèi)嵌字段和數(shù)組創(chuàng)建索引。內(nèi)嵌對(duì)象和數(shù)組字段可以和頂級(jí)字段一起在符合索引中使用。
可以在內(nèi)嵌文檔的鍵上創(chuàng)建索引,方法與在普通鍵上創(chuàng)建索引相同。
在info中的address字段上建立索引。對(duì)子文檔創(chuàng)建索引,只有進(jìn)行與子文檔字段順序完全匹配的查詢時(shí),查詢優(yōu)化器才能使用"address"
上的索引。
MongoDB事務(wù)是什么?
事務(wù)是數(shù)據(jù)庫(kù)中處理的邏輯單元,包括一個(gè)或多個(gè)數(shù)據(jù)庫(kù)操作,既可以是讀操作,也可以是寫(xiě)操作,MongoDB支持跨個(gè)多操作、集合、數(shù)據(jù)庫(kù)、文檔和分片的ACID事務(wù)。
事務(wù)的關(guān)鍵:它要么都成功,要么都失敗。
ACID是什么?
ACID是一個(gè)事務(wù)所需要具備的一組屬性集合。
ACID是原子性atomicity、一致性consistency、隔離性isolation、持久性durability的縮寫(xiě)。
ACID事務(wù)可以確保數(shù)據(jù)和數(shù)據(jù)庫(kù)狀態(tài)的有效性,即使在出現(xiàn)斷電或其它錯(cuò)誤的情況下也是如此。
原子性確保了事務(wù)中的所有操作要么都被執(zhí)行、要么都不被執(zhí)行。
一致性確??扇绻聞?wù)成功,那么數(shù)據(jù)庫(kù)將從一個(gè)一致性狀態(tài)轉(zhuǎn)移到下一個(gè)一致性狀態(tài)。
隔離性是允許多個(gè)事務(wù)同時(shí)在數(shù)據(jù)庫(kù)中運(yùn)行的屬性。它保證了一個(gè)事務(wù)不會(huì)查看到任何其它事務(wù)的部分結(jié)果,這意味著多個(gè)事務(wù)并行運(yùn)行于依次運(yùn)行每個(gè)事務(wù)所獲得的結(jié)果都相同。
持久性確保了在提交事務(wù)時(shí),即使系統(tǒng)發(fā)生故障,所有數(shù)據(jù)也都會(huì)保持持久化。
當(dāng)數(shù)據(jù)庫(kù)滿足所有這些屬性并且只有成功的事務(wù)才會(huì)被處理時(shí),它就被稱為符合ACID的數(shù)據(jù)庫(kù)。如果在事務(wù)完成之前發(fā)生故障,ACID確保不會(huì)更改任何數(shù)據(jù)。
MongoDB是一個(gè)分布式數(shù)據(jù)庫(kù),它支持跨副本集和跨分片的ACID事務(wù)。網(wǎng)絡(luò)層增加了額外的復(fù)雜性。
MongoDB提供了兩種API來(lái)使用事務(wù)
- 第一種與關(guān)系型數(shù)據(jù)庫(kù)類似(如start_transaction和commit_transaction),稱為核心API;
- 第二種稱為回調(diào)API,一般推薦使用這種;
核心API不會(huì)為大多數(shù)錯(cuò)誤提供重試邏輯,它要求開(kāi)發(fā)人員為操作、事務(wù)提交函數(shù)以及所需的任何重試和錯(cuò)誤邏輯手動(dòng)編寫(xiě)代碼。
與核心API不同,回調(diào)API提供了一個(gè)簡(jiǎn)單的函數(shù),該函數(shù)封裝了大量的功能,包括啟動(dòng)與指定邏輯會(huì)話關(guān)聯(lián)的事務(wù)、執(zhí)行作為回調(diào)函數(shù)提供的函數(shù)以及提交事務(wù)?;卣{(diào)API還提供了處理提交錯(cuò)誤的重試邏輯。在MongoDB4.2中添加回調(diào)API是為了簡(jiǎn)化使用事務(wù)的應(yīng)用程序開(kāi)發(fā),也便于添加處理事務(wù)錯(cuò)誤的應(yīng)用程序重試邏輯。
核心API和回調(diào)API的比較
核心API | 回調(diào)API |
---|---|
需要顯示調(diào)用才能啟動(dòng)和提交事務(wù) | 啟動(dòng)事務(wù)、執(zhí)行指定操作,然后提交(可在發(fā)生錯(cuò)誤前終止) |
不包含TransientTransactionError和UnknowTransactionCommitResult的錯(cuò)誤處理邏輯,而是提供了為這些錯(cuò)誤進(jìn)行自定義處理的靈活性 | 自動(dòng)為TransientTransactionError和UnknowTransactionCommitResult提供錯(cuò)誤處理邏輯 |
要求為特定事務(wù)將顯式的邏輯會(huì)話傳遞給API | 要求為特定事務(wù)將顯式的邏輯會(huì)話傳遞給API |
聚合框架是什么?
聚合框架是MongoDB中的一組分析工具,可以對(duì)一個(gè)或多個(gè)集合中的文檔進(jìn)行分析。
聚合框架基于管道的概念,使用聚合管道可以從MongoDB集合獲取輸入,并將該集合中的文檔傳遞到一個(gè)或多個(gè)階段,每個(gè)階段對(duì)輸入執(zhí)行不同的操作。每個(gè)階段都將之前階段輸出的內(nèi)容作為輸入。所有階段的輸入和輸出都是文檔,可以稱為文檔流。
每個(gè)階段都會(huì)提供一組按鈕或可調(diào)參數(shù),可以通過(guò)控制它們來(lái)設(shè)置該階段的參數(shù),以執(zhí)行各種任務(wù)。
這些可調(diào)參數(shù)通常采用運(yùn)算符的形式,可以使用這些運(yùn)算符來(lái)修改字段、執(zhí)行算術(shù)運(yùn)算、調(diào)整文檔形狀、執(zhí)行各種累加任務(wù)或其它各種操作。
常見(jiàn)的聚合管道包括匹配match、投射project、排序sort、跳過(guò)skip、限制limit。
到此這篇關(guān)于MongoDB中連接池、索引、事務(wù)的文章就介紹到這了,更多相關(guān)MongoDB中連接池、索引、事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot?整合mongoDB并自定義連接池的示例代碼
- SpringBoot中使用MongoDB的連接池配置
- springboot配置mongodb連接池的方法步驟
- Spring Boot中使用MongoDB的連接池配置的方法
- java實(shí)現(xiàn)mongodb的數(shù)據(jù)庫(kù)連接池
- SpringDataMongoDB多文檔事務(wù)的實(shí)現(xiàn)
- mongoDB 4.0事務(wù)回滾的辛酸歷程探究
- MongoDB中唯一索引(Unique)的那些事
- MongoDB索引使用詳解
- MongoDB的基礎(chǔ)查詢和索引操作方法總結(jié)
- pymongo給mongodb創(chuàng)建索引的簡(jiǎn)單實(shí)現(xiàn)方法
- 深入理解MongoDB的復(fù)合索引
相關(guān)文章
記一次Mongodb中admin數(shù)據(jù)庫(kù)導(dǎo)致的事故
這篇文章主要給大家介紹了關(guān)于一次Mongodb中admin數(shù)據(jù)庫(kù)導(dǎo)致的事故的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03mongodb 實(shí)現(xiàn)遠(yuǎn)程連接
這篇文章主要介紹了mongodb 實(shí)現(xiàn)遠(yuǎn)程連接,需要的朋友可以參考下2014-07-07MongoDB詭異問(wèn)題之sh.stopBalancer卡住的解決方法
這篇文章主要給大家介紹了關(guān)于MongoDB詭異問(wèn)題之sh.stopBalancer卡住解決的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03MongoDB磁盤(pán)空間占滿導(dǎo)致數(shù)據(jù)庫(kù)被鎖定的解決方法
我在實(shí)際項(xiàng)目中,遇到一個(gè)問(wèn)題,隨著數(shù)據(jù)每天的不斷增加,導(dǎo)致mongodb的磁盤(pán)空間站滿了,數(shù)據(jù)庫(kù)被鎖了,無(wú)法使用,所以本文給大家介紹了清理MongoDB數(shù)據(jù)和磁盤(pán)空間的方法,需要的朋友可以參考下2024-04-04Windows系統(tǒng)啟動(dòng)MongoDB報(bào)錯(cuò)無(wú)法連接服務(wù)器的問(wèn)題及解決方案
在Windows系統(tǒng)中啟動(dòng)MongoDB時(shí)遇到連接拒絕的錯(cuò)誤,通常是因?yàn)榉?wù)未運(yùn)行或配置問(wèn)題,本文給大家分享Windows系統(tǒng)啟動(dòng)MongoDB報(bào)錯(cuò)無(wú)法連接服務(wù)器的問(wèn)題及解決方案,一起看看吧2024-10-10Mongoose find 查詢返回json數(shù)據(jù)處理方式
這篇文章主要介紹了Mongoose find 查詢返回json數(shù)據(jù)處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04在PyCharm中安裝Mongo Plugin的詳細(xì)教程
這篇文章主要介紹了在PyCharm中安裝Mongo Plugin的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11