मैं MongoClient वर्ग के साथ काफी असहज महसूस करता हूं, निश्चित रूप से क्योंकि मुझे ठीक से समझ में नहीं आता कि यह क्या है और यह कैसे काम करता है।

MongoClient.createShared को पहली कॉल वास्तव में बना देगी पूल, और निर्दिष्ट कॉन्फ़िगरेशन का उपयोग किया जाएगा।

बाद की कॉल एक नया क्लाइंट इंस्टेंस लौटाएगी जो समान पूल का उपयोग करता है, इसलिए कॉन्फ़िगरेशन का उपयोग नहीं किया जाएगा।

क्या इसका मतलब यह है कि पैटर्न होना चाहिए:

  1. स्टार्टअप फ़ंक्शन में, पूल बनाने के लिए, हम कॉल करते हैं

    mc = MongoClient.createShared(vx, config, "poolname");
    

    क्या इस पहली कॉल के सफल होने पर लौटाया गया मूल्य mc महत्वपूर्ण है? यदि पूल का निर्माण विफल हो जाता है तो इसका मूल्य क्या है? दस्तावेज नहीं कहते हैं। एक सॉकेट अपवाद है यदि mongod नहीं चल रहा है, लेकिन अन्य मामलों के बारे में क्या?

  2. कोड में किसी अन्य स्थान पर (उदाहरण के लिए एक और वर्टिकल), क्या हम साझा वस्तुओं तक व्यवस्थित रूप से पहुंचने की आवश्यकता से बचने के लिए mc = MongoClient.createShared(vx, new JsonObject(), "poolname"); लिख सकते हैं।

  3. फिर से, एक अन्य वर्टिकल में जहाँ हमें डेटाबेस तक पहुँचने की आवश्यकता होती है, क्या हमें MongoClient mc परिभाषित करना चाहिए

    • एक वर्ग क्षेत्र के रूप में जिस स्थिति में इसे केवल stop() विधि में पूल में छोड़ा जाएगा, या
    • क्या यह MongoClient.createShared(...) के साथ आबाद और mc.close() के साथ डी-आवंटित एक चर नहीं होना चाहिए, जब हमें इसे फिर से पूल में जारी करने के लिए कनेक्शन की आवश्यकता नहीं होती है?

मैं जो लिखूंगा वह इस प्रकार है

// Main startup Verticle
import ...

public class MainVerticle extends AbstractVerticle {
  ...      
  @Override
  public void start(Future<Void> sf) throws Exception {
     ...
     try {
       MongoClient.createShared(vx, config().getJsonObject("mgcnf"),  "pool");
     }
     catch(Exception e) {
       log.error("error error...");
       sf.fail("failure reason");
       return;
     }
     ...
     sf.complete();
  }
  ...some other methods
}

और फिर, किसी और जगह

public class SomeVerticle extends AbstractVerticle {

    public void someMethod(...) {
    ...
    // use the database:
    MongoClient mc = MongoClient.createShared(vx,  new JsonObject(),  "pool");
        mc.save(the_coll, the_doc, res -> {
            mc.close();
            if(res.succeeded()) {
                ...
            }
            else {
                ...
            }   
       }
       ...
   }
   ...
}

क्या इसका कोई मतलब है ? फिर भी, यह उन उदाहरणों में नहीं है जो मुझे इंटरनेट पर मिल सकते हैं।

0
mszmurlo 13 नवम्बर 2018, 20:19

1 उत्तर

सबसे बढ़िया उत्तर

पूल के बारे में चिंता मत करो। उनका प्रयोग न करें। वे वह नहीं करते जो आपको लगता है कि वे करते हैं।

किसी भी वर्टिकल के अपने start तरीके में, AbstractVerticle से MongoClient.createShared(getVertx(), config) के इनहेरिटर्स पर एक फील्ड (जिसे आप क्लास फील्ड कहते हैं, लेकिन आपका मतलब इंस्टेंस फील्ड से है) सेट करें। क्लाइंट को अपनी stop विधि से बंद करें। बस, इतना ही।

अन्य अपवाद जो आप देखेंगे वे हैं:

  • खराब उपयोगकर्ता नाम/पासवर्ड
  • अस्वस्थ क्लस्टर स्थिति
  • Java ड्राइवर के पास 500 या 1,000 कनेक्शन की सीमा है (संस्करण के आधार पर), यदि आप इस कनेक्शन संख्या को पार करते हैं तो आपको एक अपवाद प्राप्त होगा

दोनों को VertxException में लिपटे ड्राइवर से प्रचारित किया जाएगा।

1
DoctorPangloss 10 पद 2018, 05:05