Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

नोड जेएस (getConnection)

स्पष्ट करने के लिए - Node.js नहीं है सिंगल-थ्रेडेड। आपका एप्लिकेशन कोड एक थ्रेड में निष्पादित होता है, लेकिन हुड के तहत यह जरूरत पड़ने पर उनका उपयोग करता है - एक नज़र डालें यहां (उत्तर और इसके नीचे टिप्पणी दोनों):

और:

जैसा कि आप mysql देख सकते हैं आपके द्वारा उपयोग किए जाने वाले मॉड्यूल के लिए आपको query() . के लिए कॉलबैक पास करना होगा विधि (और शायद कई और के लिए)। इसलिए जब आप इसे कॉल करते हैं, तो आपके कोड का निष्पादन जारी रहता है और डेटाबेस से परिणाम आने पर कॉलबैक कहा जाता है।

आपके प्रश्न के लिए - आप प्रत्येक अनुरोध के लिए एक नया कनेक्शन नहीं बना रहे हैं। रीडमी . पर एक नज़र डालें mysql . की फ़ाइल मॉड्यूल, पूलिंग कनेक्शन अनुभाग :

जब आप dbPool.getConnection() . पर कॉल करते हैं कनेक्शन तभी बनाया जाता है जब पूल में कोई और उपलब्ध कनेक्शन न हो - अन्यथा यह सिर्फ इसके ऊपर से एक को पकड़ लेता है। कॉलिंग objConn.release() कनेक्शन को वापस पूल में रिलीज़ करता है - इसे डिस्कनेक्ट नहीं किया जा रहा है। यह कॉल इसे आपके एप्लिकेशन के अन्य भागों द्वारा पुन:उपयोग करने की अनुमति देता है।

संक्षेप में:

  • हर अनुरोध के लिए नया कनेक्शन बनाना अच्छा विचार नहीं है क्योंकि यह आपके ऐप और डेटाबेस की मशीनों दोनों पर अधिक संसाधनों (सीपीयू, रैम) का उपयोग करेगा।
  • सभी अनुरोधों के लिए एक कनेक्शन का उपयोग करना भी गलत है क्योंकि यदि किसी भी ऑपरेशन को पूरा करने में लंबा समय लगता है तो आपका कनेक्शन रुक जाएगा और अन्य सभी अनुरोध इसके लिए प्रतीक्षा करेंगे।
  • एक कनेक्शन पूल का उपयोग करना यह एक अच्छा विचार है जो आपको एक ही समय में अपने डेटाबेस पर कई ऑपरेशन करने की अनुमति देता है, भले ही उनमें से एक को पूरा होने में लंबा समय लगे।

अपडेट करें: टिप्पणियों से सवालों के जवाब देने के लिए:

जब आप प्रत्येक अनुरोध के लिए एक कनेक्शन का उपयोग कर रहे हों तो mysql मॉड्यूल को एक नया सॉकेट खोलना है, डेटाबेस से कनेक्ट करना है और अपनी क्वेरी करने से पहले प्रमाणित करना है - इसमें समय लगता है और कुछ संसाधनों को खा जाता है। इस वजह से यह एक बुरा तरीका है।

दूसरी ओर, केवल एक कनेक्शन . का उपयोग करते समय (कनेक्शन पूल नहीं), एक क्वेरी चलाना जो पूरा होने में लंबा समय लेती है, उस कनेक्शन पर किसी भी अन्य प्रश्न को तब तक अवरुद्ध कर देगी जब तक कि यह पूरा न हो जाए - जिसका अर्थ है कि किसी अन्य अनुरोध को प्रतीक्षा करना होगा। यह भी एक बुरा तरीका है।

जब तक आप pool.getConnection() कॉल नहीं करते, हर अनुरोध के लिए एक नया कनेक्शन पूल बनाना नए कनेक्शन का उपयोग करने जैसा है। कई बार - तो यह और भी बुरा है (नया कनेक्शन बनाकर उपयोग किए गए संसाधनों को लें और इसे pool.getConnection() की संख्या से गुणा करें। कॉल)।

प्रत्येक ऑपरेशन के लिए एक कनेक्शन . को और स्पष्ट करने के लिए बनाम एक कनेक्शन में सभी ऑपरेशन प्रश्न:

प्रत्येक कनेक्शन में प्रत्येक ऑपरेशन पिछले एक के पूरा होने के बाद शुरू होता है (यह सिंक्रोनस है, लेकिन क्लाइंट साइड पर नहीं है), इसलिए यदि आपके पास कुछ अरब पंक्तियों वाली एक टेबल है और SELECT * FROM yourtable जारी करें इसे पूरा होने में कुछ समय लगेगा, इस कनेक्शन पर प्रत्येक ऑपरेशन को समाप्त होने तक अवरुद्ध कर देगा।

यदि आपके पास प्रत्येक ऑपरेशन के लिए एक कनेक्शन है जिसे समानांतर में जारी करने की आवश्यकता है (उदाहरण के लिए। प्रत्येक अनुरोध के लिए) समस्या गायब हो जाती है। लेकिन जैसा कि पहले कहा गया है कि एक नया कनेक्शन खोलने के लिए समय और संसाधनों की आवश्यकता होती है, यही वजह है कि कनेक्शन पूल अवधारणा पेश की गई थी।

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

अपडेट #2:

टिप्पणियों के आधार पर मैं देखता हूं कि मुझे कनेक्शन पूल के पीछे की अवधारणा को भी समझाना चाहिए। यह कैसे काम करता है कि आप एक कनेक्शन पूल के साथ एक ऐप शुरू करते हैं जो खाली है और अधिकतम n बनाने के लिए शुरू किया गया है। कनेक्शन (afaik यह mysql . के लिए 10 है डिफ़ॉल्ट रूप से मॉड्यूल)।

जब भी आप dbPool.getConnection() पर कॉल करें यह जांचता है कि पूल में कोई कनेक्शन उपलब्ध है या नहीं। यदि वहाँ हैं तो यह एक पकड़ लेता है (इसे अनुपलब्ध बनाता है), यदि नहीं तो यह एक नया बनाता है। यदि कनेक्शन की सीमा समाप्त हो गई है और कोई कनेक्शन उपलब्ध नहीं है तो किसी प्रकार का अपवाद उठाया जाता है।

कॉलिंग connection.release() कनेक्शन को वापस पूल में छोड़ता है ताकि यह फिर से उपलब्ध हो।

संपूर्ण ऐप के लिए केवल एक वैश्विक कनेक्शन प्राप्त करने के लिए पूल का उपयोग करना पूरी तरह से गलत है और स्वयं अवधारणा के विरुद्ध है (आप केवल मैन्युअल रूप से कनेक्शन बनाकर ऐसा ही कर सकते हैं), इसलिए कनेक्शन पूल का उपयोग करके मेरा मतलब है एक कनेक्शन पूल का उपयोग करें जैसा कि इसका उपयोग किया जाना चाहिए था - जब आपको उनकी आवश्यकता हो तो उससे कनेक्शन प्राप्त करने के लिए



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. वर्कबेंच के साथ सर्वर से डेटाबेस का ईआर मॉडल कैसे प्राप्त करें

  2. पीएचपी - सरल नेस्टेड अनियंत्रित सूची (यूएल) सरणी

  3. डेटाबेस में टाइमस्टैम्प डालें + 7 दिन

  4. डेटारेडर त्रुटि में कोई क्वेरी कैसे हल करें?

  5. डीबी में कोई तालिका मौजूद है या नहीं, यह जांचने में समस्याएं