2015-06-08 4 views
6

आप नए सी # ड्राइवर 2.0 के साथ Ping कमांड कैसे कहते हैं?
पुराने ड्राइवर में यह Server.Ping() के माध्यम से उपलब्ध था? साथ ही, क्या यह पता लगाने का कोई तरीका है कि क्या सर्वर वास्तविक क्वेरी चलाने के बिना चल रहा है/प्रतिक्रिया दे रहा है?
mongoClient.Cluster.Description.State का उपयोग करने से मदद नहीं मिलती है क्योंकि यह अभी भी मोंगो सर्वर ने जवाब देना शुरू करने के बाद भी डिस्कनेक्ट किया गया राज्य दिया है।MongoDB ड्राइवर 2.0 सी # क्या यह पता लगाने का कोई तरीका है कि सर्वर नीचे है या नहीं? नए ड्राइवर में हम पिंग कमांड कैसे चला सकते हैं?

+0

[2.0 चालक में MongoServer.State बराबर] (http://stackoverflow.com/questions/29459990/mongoserver-state-equivalent-in-the-2-0-driver) के संभावित डुप्लिकेट – i3arnon

+0

क्यों करेंगे आप एक नियंत्रित कनेक्शन टाइमआउट के बजाय पिंग का उपयोग करते हैं? यदि आपके पास उच्च पिंग है, तो जब आप सर्वर से कनेक्ट करेंगे तो "डीबी से कनेक्ट करने के लिए कुल समय" दोगुना हो जाएगा (पिंग समय + वास्तविक कनेक्शन समय) –

+0

mongoClient.Cluster.Description.State विश्वसनीय नहीं है - इसके बाद भी देखा गया सर्वर वापस था हम राज्य को डिस्कनेक्ट के रूप में प्राप्त कर रहे थे। मैं त्वरित कनेक्टिविटी परीक्षण की जांच करने और अपवाद फेंकने के लिए पिंग का उपयोग करने की उम्मीद कर रहा था और रिकॉर्ड की संख्या के कारण प्रतिक्रिया में देरी के कारण कभी-कभी पूछताछ अपवाद बनाम कनेक्टिविटी अपवादों को अलग-अलग क्वेरी/कमांड टाइमआउट के लिए क्वेरी पर आगे बढ़ने की उम्मीद नहीं कर रहा था। –

उत्तर

3

आप अपने Description संपत्ति का उपयोग कर क्लस्टर की स्थिति की जांच कर सकते हैं:

var state = _client.Cluster.Description.Servers.Single().State; 
+0

मैंने कोशिश की लेकिन सर्वर आने के बाद भी राज्य डिस्कनेक्ट के रूप में वापस आ रहा था। –

+0

@ हेनापेटेल AFAIK यह अंतिम ऑपरेशन की स्थिति को दर्शाता है। वास्तव में कनेक्शन की जांच करने के लिए आपको एक सक्रिय ऑपरेशन करने की आवश्यकता है और देखें कि यह विफल रहता है या नहीं। – i3arnon

+1

mongoClient.Cluster.Description.State विश्वसनीय नहीं है - सर्वर वापस आने के बाद भी देखा गया था कि हम राज्य को डिस्कनेक्ट कर रहे थे। मैं त्वरित कनेक्टिविटी परीक्षण की जांच करने और अपवादों को फेंकने के लिए पिंग का उपयोग करने की उम्मीद कर रहा था और रिकॉर्ड की संख्या के कारण प्रतिक्रिया को वापस करने में देरी की वजह से कनेक्टिविटी अपवाद बनाम कभी-कभी क्वेरी/कमांड टाइमआउट को अलग करने के लिए क्वेरी पर आगे नहीं बढ़ता था। –

1

यह मेरे लिए काम किया:

var state = _client.Cluster.Description.State 

आपको लगता है कि क्लस्टर से बाहर एक विशिष्ट सर्वर चाहते हैं तो आप Servers संपत्ति का उपयोग कर सकते दोनों सी # ड्राइवर 2 और 1

int count = 0; 
var client = new MongoClient(connection); 
     // This while loop is to allow us to detect if we are connected to the MongoDB server 
     // if we are then we miss the execption but after 5 seconds and the connection has not 
     // been made we throw the execption. 
     while (client.Cluster.Description.State.ToString() == "Disconnected") { 
      Thread.Sleep(100); 
      if (count++ >= 50) { 
       throw new Exception("Unable to connect to the database. Please make sure that " 
        + client.Settings.Server.Host + " is online"); 
      } 
     } 
0

@ i3arnon के उत्तर के रूप में मैं ca n बता कि इस तरह से मेरे लिए विश्वसनीय था:

var server = client.Cluster.Description.Servers.FirstOrDefault(); 
var serverState = ServerState.Disconnected; 
if (server != null) serverState = server.State; 

या नेट

var serverState = client.Cluster.Description.Servers.FirstOrDefault()?.State 
    ?? ServerState.Disconnected; 

के नए संस्करण में लेकिन आप इसे इस तरह से कर सकते हैं यदि आप वास्तव में एक पिंग कमांड चलाना चाहते हैं:

var command = new CommandDocument("ping", 1); 
try 
{ 
    db.RunCommand<BsonDocument>(command); 
} 
catch (Exception ex) 
{ 
    // ping failed 
} 
संबंधित मुद्दे