MongoDB 客戶端連接選項
來自專欄 K棧
基於 MongoDB Java Driver 3.8.1 的客戶端配置選項,其它驅動大同小異。
description
java.lang.String
客戶端的描述。該描述用於日誌記錄和 JMX 等位置。
默認為 null。
applicationName
java.lang.String
Server Version: 3.4
應用程序的邏輯名稱。客戶端可以據此標識應用程序伺服器,用於伺服器日誌、慢查詢日誌及概要收集。
默認為 null。
minConnectionsPerHost
int
每個主機的最小連接數,這些連接在空閑時將保持在連接池中。
默認為 0,不能小於 0。
maxConnectionsPerHost
int
每個主機允許的最大連接數,這些連接在空閑時將保持在連接池中。當連接池耗盡後,任何需要連接的操作都將被阻塞並等待可用連接。
默認為 100,不能小於 1。
threadsAllowedToBlockForConnectionMultiplier
int
允許阻塞的連接線程數乘數。該值和 maxConnectionsPerHost 相乘的結果就是連接等待隊列的最大值,超出的線程將立即拋出異常。
如該值為 5,maxConnectionsPerHost 為 10,則最多可以同時有 50 個線程等待連接。
默認為 5,不能小於 1。
maxWaitTime
int
線程從連接池中獲取可用連接的最長等待時間(毫秒)。
默認為 120,000(120秒),0 表示不等待,負值意味著無限期等待。
maxConnectionIdleTime
int
連接池中連接的最大空閑時間(毫秒)。超出空閑時間的連接將被關閉,並在必要時由新建連接替換。
默認為 0,表示無限制,不能小於 0。
maxConnectionLifeTime
int
連接池中連接的最大使用壽命(毫秒)。超出使用壽命的連接將被關閉,並在必要時由新建連接替換。
默認為 0,表示無限制,不能小於 0。
connectTimeout
int
連接超時時間(毫秒),僅在新建連接時使用。
默認為 10,000(10秒),0 表示無限制,不能小於 0。
socketTimeout
int
socket 超時時間(毫秒),用於 I/O 讀寫操作。
默認為 0,表示無限制。
socketKeepAlive
boolean
是否啟用 socket 的 keep-alive 功能。
該選項從 MongoDB Java Driver 3.5.0 版開始已經廢棄,現在默認值為 true,不建議禁用。
heartbeatFrequency
int
心跳檢測頻率(毫秒)。該選項用於設定驅動程序每次嘗試確定每個伺服器當前狀態的間隔時間。
默認為 10,000(10秒)。
minHeartbeatFrequency
int
心跳檢測的最小頻率(毫秒)。如果驅動程序需要經常檢查伺服器的可用性,那麼距離上次檢測至少等待這麼長時間,以避免資源浪費。
默認為 500。
heartbeatConnectTimeout
int
用於心跳檢測的連接超時時間(毫秒)。
默認為 20,000(20秒)。
heartbeatSocketTimeout
int
用於心跳檢測的 socket 超時時間(毫秒)。
默認為 20,000(20秒)。
retryWrites
boolean
Server Version: 3.6
設定當由於網路錯誤而寫入失敗時,是否進行重試。
sslEnabled
boolean
是否啟用 SSL。
在未設置 socket factory 的情況下,設置該選項時將同時設置默認的 socket factory,true 時為 java.net.ssl.SSLSocketFactory.getDefault()
,false 時為 javax.net.SocketFactory.getDefault()
。
開啟該選項時,如果設置其它 socket factory,則該 factory 必須創建 java.net.ssl.SSLSocket
的實例,否則將拒絕連接。
默認為 false,不啟用。
sslInvalidHostNameAllowed
boolean
啟用 SSL 時是否允許無效的主機名(證書域名檢查)。true 為允許,即關閉域名檢查。
設為 true(允許無效主機名)將使應用程序容易受到中間人攻擊。
注意,證書域名檢查需要 Java 7 及以上版本,如果應用程序使用了 SSL 運行在 Java 6 上,則必須將該選項設為 true(關閉域名檢查)。
默認為 false,即開啟域名檢查,不允許無效的主機名。
socketFactory
javax.net.SocketFactory
用於建立 socket 的工廠。
默認為 javax.net.SocketFactory.getDefault()
。
sslContext
javax.net.ssl.SSLContext
啟用 SSL 時使用的 SSLContext,當 sslEnabled 為 false 或指定了 socket factory 時,將忽略此選項。
requiredReplicaSetName
java.lang.String
指定必須的副本集名稱。確保連接的所有節點都屬於一個指定的副本集。
設置該選項後,客戶端將進行以下行為——
- 以副本集模式連接,並根據給定的伺服器發現副本集的所有成員。
- 確保所有成員報告的副本集名稱與指定名稱匹配。
- 如果伺服器列表中的任何成員不屬於該副本集,則拒絕所有請求。
默認為 null。
localThreshold
int
用於伺服器選擇的一個參考閾值,單位為毫秒。如果對於某個操作存在多個合適的伺服器,則以該選項的值來確定一個基於延遲時間(RTT)的延遲窗口範圍(Latency Window)。以延遲最小的伺服器為基準(最小延遲時間),所有延遲時間和最小延遲時間的差值小於該值的伺服器,都有資格被隨機選中。
如果該參數設為 0,則不使用隨機演算法,而是選擇延遲時間最小的伺服器。
默認為 15 毫秒,意味著所有有資格被選中的伺服器之間的延遲時間只有 15 毫秒以內的差異。
serverSelector
com.mongodb.selector.ServerSelector
伺服器選擇器。用於增強標準的伺服器選擇規則。
在執行該選擇器篩選出符合要求的伺服器列表後,驅動程序將繼續執行以下兩個選擇操作——
- 根據 localThreshold 選出延遲窗口範圍內的伺服器;
- 繼續從延遲窗口範圍內的伺服器隨機選擇一個伺服器。
要跳過基於延遲窗口的選擇,可以使用以下方法——
- 將 localThreshold 設置為足夠高的值,以便不排除任何伺服器。
- 使該選擇器返回的列表只包含單個伺服器,這將使後續的選擇操作沒有其它伺服器可選。
serverSelectionTimeout
int
伺服器選擇的超時時間(毫秒),指定驅動程序從集群中選擇伺服器時,無法成功而放棄並拋出異常的時間。可以根據需要(如耐心等待或快速返回錯誤)來設置該參數的值。
默認為 30,000(30秒),這個時間對於在經典的故障恢復階段中選舉出新的主節點來說已經足夠。0 表示無可用伺服器,將立即超時;負值意味著無限期等待。
alwaysUseMBeans
boolean
設置驅動程序註冊的 JMX Beans 是否始終為 MBeans,無論 VM 是不是 Java 6 及更高版本。
當該選項為 false 時,驅動程序將在 Java 6 或更高版本時使用 MXBeans;Java 5 中使用 MBeans。
默認為 false。
compressorList
java.util.List<com.mongodb.MongoCompressor>
Server Version: 3.4
用於向 MongoDB 伺服器收發消息的壓縮器列表。驅動程序將使用伺服器配置支持的列表中的第一個壓縮器。
默認為空列表。
writeConcern
com.mongodb.WriteConcern
寫入策略,用於控制寫入安全的級別,以保障寫操作的可靠性。可選配置如下——
- w – 該選項要求寫入確認操作已經傳遞到指定數量的節點或指定標籤的節點。有以下可選值——
- w:0 (Unacknowledged) – 寫入操作調用後立刻返回,無法知道寫入是否成功。性能最好,但可靠性最差,不推薦使用。此外還有一個
w:-1 (error ignored)
級別,基本和w:0
差不多,不同的是w:0
對於網路錯誤會返回異常,而w:-1
不會捕獲任何異常。 - w:1 (Acknowledged) – 等待實際寫入操作完成後才返迴響應,如果寫入發生錯誤,可以捕獲到並進行處理。該級別具備基本的可靠性,是目前的默認設置。
- w:2 (Replica Acknowledged) – 當 secondary 節點從 primary 節點完成了複製之後返迴響應。其中的數字 2 表示完成複製操作的節點數目,可以是其它
>=2
的數字,如w:3
表示至少要有 3 個節點有數據。 - w:majority – 和
w:2
一樣,secondary 節點從 primary 節點完成數據複製後返迴響應。不同的是這裡並不指定具體的節點數量,而是使用majority
表示「大多數」,即超過一半(>1/2
)的節點數。 - tag set – 指定副本集成員的標籤,要求寫入確認已經傳遞到指定 tag 標記的副本集成員後返迴響應。
- wtimeout – 寫入超時時間(毫秒)。用於設定一個時間限制,當寫入過程持續超過該時間後則認為寫入失敗。該選項僅適用於集群環境,當指定
w
值大於 1 時生效。數據需要寫入指定數量的節點才算成功,但如果有節點發生故障,可能導致這個數量無法達到,從而無法進行響應,通過設定這個超時時間,可以防止寫入操作被無限制阻塞。該參數可以設置為 0,表示無限期。 - journal – 寫入操作記錄到 Journal Log 持久化之後才向客戶端返迴響應。該選項要求服務端開啟 journaling 功能,不能與 fsync 結合使用。要記錄到 Journal Log 必須等到下一次提交,可以通過增加 Journal Log 的提交頻率來降低延遲。
默認為 w:1(com.mongodb.WriteConcern.ACKNOWLEDGED
)。
readConcern
com.mongodb.ReadConcern
Server Version: 3.2
讀取策略(隔離級別),決定集群環境中如何返回數據——
- local – 直接從本地讀取,不考慮數據是否已經在集群的其它節點同步,默認值。
- majority – 只讀取成功寫入大多數節點的數據。
- linearizable –
Server Version: 3.4
版本引入。和 majority 類似,但修復了 majority 的一些 bug,但比 majority 在性能上的損耗更大。linearizable 對於同一文檔的並發讀、寫操作時線性的。 - snapshot –
Server Version: 4.0
版本引入。MongoDB 從 4.0 開始支持副本集多文檔事務,同時提供了 snapshot 隔離級別,在事務開始時創建一個 WiredTiger snapshot(快照),保存當時整個引擎所有事務的狀態,確定哪些事務對當前可見,哪些不可見,然後在整個事務過程中使用這個快照提供事務讀。
該選項可用於解決「臟讀」的問題,如從 primary 節點上讀取了某條數據,但這條數據並沒有同步到大多數節點,然後 primary 節點故障,重新恢復後 primary 節點會將未同步到大多數節點的數據回滾掉,導致之前讀取的數據成了「臟數據」。
而將 readConcern 的級別設置為 majority
,則可以保證讀取到的數據已經寫入大多數節點,這些數據不會發生回滾,也就避免了「臟讀」的問題。需要注意的是,該級別能保證讀取到的數據不會發生回滾,但並不能保證讀到的數據是最新的。
該選項可以和 readPreference 配合使用。
readPreference
com.mongodb.ReadPreference
用於查詢、Map-Reduce、聚合、計數的讀取首選項。
MongoDB 有 5 種 ReadPreference 模式——
- primary – 主節點,默認模式,只從 primary 節點讀取,如果 primary 節點不可用,則報錯或拋出異常。
- primaryPreferred – 首選主節點,優先從 primary 節點讀取,如果 primary 節點不可用(如故障轉移),則從 secondary 節點讀取。
- secondary – 從節點,只從 secondary 節點讀取,如果 secondary 節點不可用,則報錯或拋出異常。
- secondaryPreferred – 優先從 secondary 節點讀取,如果沒有可用的 secondary 節點,則從 primary 節點讀取。
- nearest – 最近節點,根據網路距離從最近的節點讀取,可能是 primary 節點或 secondary 節點。
默認為 primary(com.mongodb.ReadPreference.primary()
)。
cursorFinalizerEnabled
boolean
是否啟用游標的 finalize 方法,用於清理客戶端未關閉的 DBCursor 實例。
如果能夠確保每次都會調用 DBCursor 的 close 方法,則可以關閉該選項(設為 false)。
默認為 true。
codecRegistry
org.bson.codecs.configuration.CodecRegistry
編解碼器註冊表。編解碼器用於對 Document 進行編碼和解碼。
dbEncoderFactory
com.mongodb.DBEncoderFactory
編碼器工廠。
默認使用驅動程序的標準配置。
dbDecoderFactory
com.mongodb.DBDecoderFactory
解碼器工廠。
默認使用驅動程序的標準配置。
commandListeners
java.util.List<com.mongodb.event.CommandListener>
命令事件監聽器集合。
默認為空列表。
clusterListeners
java.util.List<com.mongodb.event.ClusterListener>
與集群相關的事件監聽器集合。
默認為空列表。
connectionPoolListeners
java.util.List<com.mongodb.event.ConnectionPoolListener>
與連接池相關的事件監聽器集合。
默認為空列表。
serverListeners
java.util.List<com.mongodb.event.ServerListener>
與伺服器相關的事件監聽器集合。
默認為空列表。
serverMonitorListeners
java.util.List<com.mongodb.event.ServerMonitorListener>
與伺服器監控相關的事件監聽器集合。
默認為空列表。
本文鏈接:http://kweny.io/mongodb-client-connection-options/
版權聲明:除非特別說明,本站內容均為原創,轉載請註明出處:K棧 - 《MongoDB 客戶端連接選項》。推薦閱讀:
※Mysql表連接方式
※node-mongodb上手指南
※MongoDB學習筆記(查詢)
※不會資料庫命名的看過來啦!
※mongo-elasticsearch-py查詢了解下
TAG:MongoDB |