MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

देशी ड्राइवर और Express.js के साथ MongoDB का उपयोग करते समय टोपोलॉजी नष्ट हो गई थी

ऐसा इसलिए है क्योंकि कोड में एक एंटी-पैटर्न होता है:हर बार जब कोई नया अनुरोध आता है, तो यह एक नया डेटाबेस कनेक्शन खोलता है, फिर प्रतिक्रिया भेजे जाने के बाद उस कनेक्शन को बंद कर देता है। इसके बाद बाद में बंद कनेक्शन का पुन:उपयोग करने का प्रयास किया गया, इसलिए दूसरे अनुरोध पर आप जो त्रुटि संदेश देख रहे हैं।

आप जो चाहते हैं वह वैश्विक कनेक्शन ऑब्जेक्ट का उपयोग करके एप्लिकेशन के जीवनकाल के लिए केवल एक बार डेटाबेस से कनेक्ट करना है, फिर अपने डेटाबेस संचालन को करने के लिए उस वैश्विक ऑब्जेक्ट का उपयोग करें।

इस वैश्विक वस्तु का उपयोग करने से MongoDB ड्राइवर को डेटाबेस से कनेक्शन पूल ठीक से बनाने की अनुमति मिलती है। यह पूल MongoDB ड्राइवर द्वारा प्रबंधित किया जाता है, और महंगे कनेक्ट/रीकनेक्ट पैटर्न से बचा जाता है।

उदाहरण के लिए:

// listen on this port
const port = 3000

// global database client object
var client = null

// listen on the configured port once database connection is established
MongoClient.connect('mongodb://localhost:27017', { useNewUrlParser: true }, (err, res) => {
  assert.equal(null, err)
  client = res
  app.listen(port, () => console.log(`Example app listening on port ${port}!`))
})

// use the client global object for database operations
app.get('/', (req, res) => {
  db = req.query.db
  col = req.query.col
  client.db(db).collection(col).find({}).toArray((err, docs) => {
    assert.equal(null, err)
    res.send(JSON.stringify(docs))
  })
})

संपादित करें कमेंट में अपने सवाल का जवाब देने के लिए:

ऐसा इसलिए है क्योंकि मूल कोड में, dbClient विश्व स्तर पर परिभाषित किया गया था। जब dbClient.close() कहा जाता था, वैश्विक dbClient बंद था। तब एक त्रुटि उत्पन्न हुई जब वह dbClient वस्तु का पुन:उपयोग किया गया। ऐसा इसलिए है क्योंकि connect() एक कनेक्शन के बजाय एक कनेक्शन पूल बनाता है, और प्रति आमंत्रण कई बार कॉल किए जाने की उम्मीद नहीं थी।

यदि आप dbClient वैश्विक दायरे से app.get() . में परिवर्तनशील संदर्भ में, आप पाएंगे कि जब आप HTTP एंडपॉइंट को कई बार एक नए dbClient के रूप में कॉल करते हैं, तो कोई त्रुटि उत्पन्न नहीं होगी। ऑब्जेक्ट हर बार बनाया गया था।

ऐसा कहकर, हालांकि यह काम करेगा, यह अनुशंसित पैटर्न नहीं है। मेरे द्वारा ऊपर पोस्ट किए गए उदाहरण कोड के समान पैटर्न का उपयोग करना बेहतर है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoEngine - एक अन्य उपयोगकर्ता पहले से ही इस डेटाबेस के लिए प्रमाणित है। आपको पहले लॉगआउट करना होगा

  2. स्प्रिंग डेटा मोंगोडब आईडी फील्ड मैपिंग

  3. MongoDB मेरी अनुक्रमणिका का उपयोग नहीं कर रहा है

  4. ASP.Net MVC में MongoDB कनेक्शन प्रबंधित करने का सही तरीका क्या है?

  5. वास्तव में मोंगो से कनेक्ट किए बिना, मोंगो से कनेक्ट होने वाली विधि का परीक्षण कैसे करें?