2009-11-10 12 views
12

क्या पूरे सत्र में कनेक्शन को खोलना सुरक्षित है? मैंने एक सी # एप्लिकेशन बनाया जो एक MySQL डेटाबेस से कनेक्ट होता है, प्रोग्राम दोनों इसे पढ़ता है और लिखता है और एप्लिकेशन को दिन में लगभग 10 घंटे चलना पड़ता है।MySQL कनेक्शन, क्या मैं इसे खोल सकता हूं?

क्या डेटाबेस से कुछ तोड़ने के बाद और कुछ नया करने की आवश्यकता होने पर इसे फिर से खोलने के बाद कनेक्शन() फ़ंक्शन को कॉल करने के बजाय कनेक्शन को खोलने के लिए कोई जोखिम संलग्न है?

उत्तर

8

थोड़ी देर के लिए खुला एक कनेक्शन छोड़कर, ठीक है जब तक:

  1. आप इतने सारे समवर्ती निष्क्रिय कनेक्शन है कि आप MySQL कनेक्शन सीमा मारा नहीं है;

  2. आप कुछ भी किए बिना घंटे के लिए इसे खोलने के लिए नहीं छोड़ते हैं। डिफ़ॉल्ट MySQL कनेक्शन wait_timeout 8 घंटे है; उस कनेक्शन के लिए एक निष्क्रिय निष्क्रिय छोड़ दें और जब आप इसका उपयोग करने के लिए आते हैं तो आपको "MySQL सर्वर चला गया है" त्रुटि मिल जाएगी।

+2

कनेक्शन को खोलकर वास्तव में प्राप्त करने के लिए कुछ भी नहीं है (यह मानते हुए कि प्रदाता कनेक्शन पूलिंग का उपयोग करता है)। आधिकारिक MySQL कनेक्टर/नेट प्रदाता डिफ़ॉल्ट रूप से कनेक्शन पूलिंग का उपयोग करता है। ओपी का उल्लेख नहीं है कि वे वास्तव में किस प्रदाता का उपयोग कर रहे हैं, लेकिन यदि यह पूलिंग का समर्थन करता है तो मैं खुली देर/बंद प्रारंभिक रणनीति का उपयोग करता हूं और प्रदाता को अंतर्निहित भौतिक कनेक्शन प्रबंधित करने देता हूं। – LukeH

+0

पुराने धागे के लिए टिप्पणी जोड़ने के लिए खेद है। मैंने http://download.oracle.com/javadb/10.3.3.0/devguide/cdevconcepts89498.html पढ़ा है, ऐसा लगता है जब तक आपके एप्लिकेशन में बहु थ्रेड/लेन-देन होते हैं, प्रत्येक थ्रेड को एक अलग कनेक्शन में असाइन करना अच्छा अभ्यास है । धन्यवाद। –

0

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

0

देखने के एक सुरक्षा की दृष्टि से, मैं एक प्रश्न के बाद इसे बंद करने के लिए अपने बेहतर कहेंगे, बस यह सुनिश्चित करें कि कोई अन्य कार्यक्रम खोला कनेक्शन में अपने आप चीजों को इंजेक्षन कर सकते हैं हो सकता है।

प्रदर्शन के रूप में, यह पूरे समय के माध्यम से कनेक्शन खोलने के लिए स्पष्ट रूप से बेहतर है।

आपकी पसंद ^^

9

आप ADO.NET का उपयोग कर रहे हैं, इसलिए आपको ADO.NET के इनबिल्ट क्षमताओं पूलिंग कनेक्शन का उपयोग कर सकते हैं। असल में, मुझे इसे परिष्कृत करने दें: आप हमेशा ADO.NET की इनबिल्ट कनेक्शन पूलिंग क्षमताओं का उपयोग करें। ऐसा करके आप पृष्ठभूमि में अपने कनेक्शन को पारदर्शी रूप से प्रबंधित करने के लिए .NET रनटाइम प्राप्त करेंगे। यह कनेक्शन थोड़ी देर के लिए खुला रखेगा, भले ही आपने उन्हें बंद कर दिया हो और यदि आप कोई नया कनेक्शन खोलें तो उनका पुन: उपयोग करें। यह वास्तव में तेज़ सामान है।

अपने कनेक्शन स्ट्रिंग में उल्लेख करना सुनिश्चित करें कि आप पूल कनेक्शन चाहते हैं क्योंकि यह डिफ़ॉल्ट व्यवहार नहीं हो सकता है।

using (var connection = SomeMethodThatCreatesAConnectionObject()) 
{ 
    // do your stuff here 
    connection.Close(); // this is not necessary as 
         // Dispose() closes it anyway 
         // but still nice to do. 
} 

है आप कैसे अपेक्षा की जाती रहे हैं यही कारण है कि यह करने के लिए:

आप केवल स्थानीय रूप से कनेक्शन बनाने के लिए जब आप उन्हें जरूरत है, तो वहाँ एक नया कनेक्शन बनाने में कोई भूमि के ऊपर है, क्योंकि वे backrgound में जमा कर रहे हैं की जरूरत है कुल मिलाकर।

0

नहीं, मुझे कोई कारण नहीं दिख रहा है कि कनेक्शन को खोलने और फिर से इसका उपयोग क्यों न करें: आखिरकार, यह विभिन्न कनेक्शन-पूल प्रौद्योगिकियों के पीछे एक संपूर्ण बिंदु है (हालांकि ये आम तौर पर आरक्षित हैं बहु-थ्रेडेड परिस्थितियों के लिए जहां सभी एक ही डेटा स्रोत पर काम कर रहे हैं)।

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

0

कनेक्शन को खोलने के लिए मेरी राय में यह अच्छा अभ्यास नहीं है। एक और पहलू जो हर समय कनेक्शन बंद करने के लिए बोलता है वह स्केलबिलिटी है। अब इसे खोलने के लिए यह ठीक हो सकता है लेकिन यदि आप ऐप का उपयोग उपयोगकर्ताओं की मात्रा से दोगुना 3 गुना करते हैं। गर्दन में यह दर्द वापस जाने और सभी कोड बदलने के लिए दर्द है। (मुझे पता है मैंने इसे किया है :-)

0

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

बेशक मैं राय का हूं, कनेक्शन का उदाहरण प्राप्त करें, इसका उपयोग करें, अपना काम प्रतिबद्ध/रोलबैक करें और इसे पूल में वापस कर दें। मैं लंबे समय तक कनेक्शन को खोलने का सुझाव नहीं दूंगा।

0

एक बात जो मैंने अन्य उत्तरों में नहीं देखी, फिर भी: यदि आपके पास बयान तैयार किए गए हैं या अस्थायी सारणी हैं तो कनेक्शन बंद होने तक वे सर्वर संसाधनों को अवरुद्ध कर सकते हैं। लेकिन दूसरी तरफ यह हर कुछ क्षणों को पुनर्जीवित करने के बजाय कनेक्शन को कुछ समय के लिए रखने के लिए उपयोगी हो सकता है।

0

यदि आप लगातार कनेक्शन खोल रहे हैं और कनेक्शन बंद कर रहे हैं तो आप एक प्रदर्शन दंड का भुगतान करेंगे। कनेक्शन पूलिंग और एक छोटा wait_timeout का उपयोग करना बुद्धिमान हो सकता है यदि आप चिंतित हैं कि आपके ऐप की कई चल रही प्रतियां बहुत सारे डेटाबेस कनेक्शन खाएंगी।

+0

यह मामला नहीं है, यह एकमात्र ऐसा एप्लिकेशन है जो चल रहा है और कुछ भी कनेक्ट करने का प्रयास नहीं करना चाहिए। – Pieter888

+1

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

+0

तो कनेक्शन * ओपन * होने पर कनेक्शन फिर से स्थापित हो जाएगा? या क्या मुझे इसका पता लगाने के लिए अपना कोड लिखना है? – Pieter888

0

हाँ आप कर सकते हैं, बशर्ते:

  • ही आपका कनेक्शन
  • आप कनेक्शन राज्य रीसेट कर सकते हैं कुछ अजीब होता है अगर
  • आप की पहचान करेगा खो कनेक्शन "शांत हो जाता है," अगर आप फिर से कनेक्ट होगा , उदाहरण के लिए यदि फ़ायरवॉल टाइमआउट

असल में विफलता मामलों और सही वसूली के लिए ध्यान देने की आवश्यकता है; कनेक्टिंग और डिस्कनेक्टिंग अक्सर बहुत आसान है।

0

मुझे लगता है कि यदि कनेक्शन पूलिंग तंत्र है, तो आप कनेक्शन को बेहतर बंद कर देंगे।

इसका एक कारण यह है कि आपको फिर से जांचने की आवश्यकता नहीं है कि आपका कनेक्शन अभी भी जीवित है या नहीं।

संबंधित मुद्दे