MongoDB C# 驅動

讀書筆記 C# Driver 之前看了Bson類庫,現在學習C# Driver Thread safety(多線程問題) 只有少部分的C# Driver類是多線程安全的。比如MongoClient,MongoServer,MongoDatabase, MongoCollection 以及MongoGridFS。一般常用的類存在多線程問題,包括MongoCurs

讀書筆記

C# Driver

之前看了Bson類庫,現在學習C# Driver

Thread safety(多線程問題)

只有少部分的C# Driver類是多線程安全的。比如MongoClient,MongoServer,MongoDatabase, MongoCollection 以及MongoGridFS。一般常用的類存在多線程問題,包括MongoCursor以及Bson類庫中的所有類(除了其中的BsonSymbolTable是線程安全的)。

所有的類的靜態屬性值和函數方法都不會引起多線程問題。

MongoClient類

這個類提供使用mongodb server的基本對象。與MongoDB server服務進行鏈接的時候,client自動進行連接。(使用了連接池來進行更有效的連接)

在連接一個副本集的時候,有且只用一個MongoClient實例。

When you are connecting to a replica set you will still use only one instance of MongoClient, which represents the replica set as a whole. The driver automatically finds all the members of the replica set and identifies the current primary.

這個類的實例不會引起多線程問題。

除非其他設置,在默認設置情況下,所有操作需要一個WriteConcern,一個寫入確定語句。另外,默認情況下,所有的寫操作會鎖定,直到server知道要進行寫操作。

Connection strings

最簡單的數據庫連接是使用Connection string。標準的Connection string如下:

mongodb://[username:password@]hostname[:port][/[database][?options]]

在使用認證的mongodb服務器上,username和password必須填寫。

port號碼是可選的。默認的是27017.

如果要連接多個服務器,可以直接填寫多個服務器名(以及需要的端口號),并且以‘,’分割。如下:

mongodb://server1,server2:27017,server2:27018

上面這段connection string 連接了三個數據庫服務,由于多數據庫服務是模糊不清的,不能分辨服務是否復本集,或者是多數據庫服務。drive驅動會跳過connection string的語法檢查,直接連接進數據庫服務器,讓server自己檢查他們的類別。還有一些辦法在連接的時候就指定數據服務器的類別,就是在connection string里面直接描述。如下:

mongodb://server1,server2:27017,server2:27018/?connect=replicaset

可用的連接模式包括:automatic (默認), direct, replica set, 以及shardrouter。連接的規則如下:

1、如果指定了某種連接模式,則直接使用否則使用默認的automatic。

2、如果在connection string中有replica set name,則使用replica set模式

3、如果connection string中僅有一個服務器,則使用direct模式

4、另外,連接服務之后,服務決定連接的模式

注意:如果有多服務器列表連接,其中有一個是復本集的一個,而其他不是,則連接模式將成為non-deterministic(未決定)。確定connection string中沒有混合服務類型。

當連接模式指定成為replica set,美國服務器,但是driver接口還是會找到primary服務器,即使該服務器不在connection連接列表中。直到connection列表中的一個服務器的回應(這個回應包括replica set以及現有的primary服務)。另外,即使在初始化語句完成之后,其他次級服務器也會被發現,并且自動加入到混合集群。這樣,香港服務器,如果你有添加以及刪除,移動replica set,driver接口會自己處理這些改變。

順便提到,假設你想要直接連接入一個replica set并且無論它是否是現在的primary(也許只是想監控下它的運行狀態或者進行只讀語句),可以使用下面連接語句:

mongodb://server2/?connect=direct;readpreference=nearest

可以在下面的鏈接獲取比較齊全的connection string文檔

更加深入地額:

SSL Support

這些不感興趣,大概是driver連接的一個設置

通過在connection string里面加入“ssl=true”選項來設置

mongodb://server2/?ssl=true

在默認的情況下,server是通過本地的受信任的證書機構獲取許可。在一些測試環境下面,測試server沒有簽署證書,為了緩解這個情況,香港虛擬主機,可以使用在connection string里面添加“sslverifycertificate=false”來屏蔽所有certificate errors(認證錯誤)。

Authentication

MongoDB支持兩種認證方式。一種是在程序執行時,調用特定的方法。在執行特定的方法時,認證將會被使用。另外一種健壯的方法是在MongoCredentialsStore存儲認證信息。

下面是一個例子,使用credential store來確定admin和“foo”數據庫的認證信息。除了使用“admin”以及“foo”連接入數據庫,還可以使用默認的認證“test”。

var url = new MongoUrl(“mongodb://test:user@localhost:27017”); var settings = MongoClientSettings.FromUrl(url); var adminCredentials = new MongoCredentials(“admin”, “user”, true); settings.CredentialsStore.Add(“admin”, adminCredentials); var fooCredentials = new MongoCredentials(“foo”, “user”, false); settings.CredentialsStore.Add(“foo”, fooCredentials); var client = new MongoClient(settings); 我感覺類似SQL語句: foo.* ; GetServer method 在MongoClient實例中調用GetServer方法獲取MongoServer的實例。 ? MongoServer class ?

使用MongoServer類可以進行更多的控制操作。它使用了先進的技術通過一個單個的socket獲取數據庫以及進行一系列的數據庫操作,并且保持數據庫的一致性。

GetDatabase method

通過這個方法訪問數據庫

例子代碼:

MongoClient client = new MongoClient(); // connect to localhost MongoServer server = client.GetServer(); MongoDatabase test = server.GetDatabase(“test”); MongoCredentials credentials = new MongoCredentials(“username”, “password”); MongoDatabase salaries = server.GetDatabase(“salaries”, credentials);

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享