पीडीओ में लगातार कनेक्शन का उपयोग करने के नुकसान क्या हैं


181

पीडीओ में, PDO::ATTR_PERSISTENTविशेषता का उपयोग करके एक कनेक्शन को लगातार बनाया जा सकता है । Php मैनुअल के अनुसार -

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

मैनुअल PDO ODBC ड्राइवर का उपयोग करते समय लगातार कनेक्शन का उपयोग नहीं करने की भी सिफारिश करता है, क्योंकि यह ODBC कनेक्शन पूलिंग प्रक्रिया में बाधा उत्पन्न कर सकता है।

तो जाहिर है कि पिछले मामले को छोड़कर, पीडीओ में लगातार कनेक्शन का उपयोग करने में कोई कमी नहीं है। हालांकि, मैं यह जानना चाहूंगा कि क्या इस तंत्र का उपयोग करने के कोई अन्य नुकसान हैं, अर्थात, ऐसी स्थिति जहां इस तंत्र के प्रदर्शन में गिरावट आती है या ऐसा कुछ होता है।


वाह, आपने इस सरल प्रश्न के लिए 1000 प्रतिनिधि इनाम का भुगतान किया?
पचेरियर

जवाबों:


287

कृपया नीचे दिए गए इस उत्तर को अवश्य पढ़ें , जो यहां बताई गई समस्याओं को कम करने के तरीकों का विवरण देता है।


समान कमियां पीडीओ का उपयोग करते हुए किसी भी अन्य PHP डेटाबेस इंटरफ़ेस के साथ मौजूद हैं जो लगातार कनेक्शन करता है: यदि आपकी स्क्रिप्ट डेटाबेस ऑपरेशन के बीच में अप्रत्याशित रूप से समाप्त हो जाती है, तो अगला अनुरोध जो बाईं ओर कनेक्शन प्राप्त करता है वह उठाएगा जहां मृत स्क्रिप्ट छोड़ दिया है। कनेक्शन को प्रबंधक स्तर पर खुला रखा जाता है (mod_php के लिए अपाचे, वर्तमान FastCGI प्रक्रिया यदि आप FastCGI, आदि का उपयोग कर रहे हैं), PHP स्तर पर नहीं, और PHP कनेक्शन को मरने देने के लिए मूल प्रक्रिया को नहीं बताता है। स्क्रिप्ट असामान्य रूप से समाप्त हो जाती है।

यदि मृत स्क्रिप्ट लॉक टेबल, उन तालिकाओं को तब तक लॉक किया जाता है जब तक कि कनेक्शन मर नहीं जाता है या अगली स्क्रिप्ट जो कनेक्शन प्राप्त करती है, टेबल को अनलॉक कर देती है।

यदि मृत स्क्रिप्ट लेन-देन के बीच में थी, तो जब तक कि डेडलॉक टाइमर किक नहीं करता तब तक तालिकाओं की एक भीड़ को ब्लॉक कर सकता है और तब भी, डेडलॉक टाइमर पुराने अनुरोध के बजाय नए अनुरोध को मार सकता है जो समस्या पैदा कर रहा है।

यदि मृत स्क्रिप्ट लेन-देन के बीच में थी, तो उस कनेक्शन को प्राप्त करने वाली अगली स्क्रिप्ट को भी लेनदेन स्थिति मिलती है। यह बहुत संभव है (आपके एप्लिकेशन डिज़ाइन पर निर्भर करता है) कि अगली स्क्रिप्ट वास्तव में कभी भी मौजूदा लेनदेन करने की कोशिश नहीं कर सकती है, या जब ऐसा नहीं होना चाहिए, या जब यह नहीं होना चाहिए तो वापस रोल करेंगी।

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

इसके अलावा, अधिकांश आधुनिक डेटाबेस (PostgreSQL सहित) के पास कनेक्शन पूलिंग करने के अपने पसंदीदा तरीके हैं जो तत्काल कमियां नहीं हैं जो सादे वेनिला PHP- आधारित लगातार कनेक्शन करते हैं।


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

बावजूद, जब गोदाम के लोग कुछ सौ आने वाले हिस्सों को संसाधित कर रहे हैं, और प्रत्येक भाग आधे सेकंड के बजाय तीन और आधे सेकंड का समय ले रहा है, तो हमें कार्रवाई करनी थी इससे पहले कि वे हम सभी का अपहरण कर लें और हमें उनकी मदद करें। इसलिए, हमने अपने घर-विकसित ईआरपी / सीआरएम / सीएमएस की संकीर्णता पर कुछ बिट्स को फ़्लिप किया और लगातार कनेक्शन के भयावहता का अनुभव किया। हमें सभी सूक्ष्म छोटी समस्याओं और विचित्र व्यवहार को ट्रैक करने के लिए सप्ताह लग गए जो यादृच्छिक रूप से प्रतीत होते थे। यह पता चला है कि एक बार एक हफ्ते की घातक त्रुटियां जो हमारे उपयोगकर्ताओं ने हमारे ऐप से परिश्रमपूर्वक निचोड़ ली हैं वे बंद टेबल, परित्यक्त लेनदेन और अन्य दुर्भाग्यपूर्ण विस्की राज्यों को छोड़ रहे थे।

इस सोब-स्टोरी में एक बिंदु है: इसने उन चीजों को तोड़ दिया, जिनके प्रदर्शन के नाम पर हमें कभी भी टूटने की उम्मीद नहीं थी। ट्रेडऑफ़ इसके लायक नहीं था, और हम उस दिन का बेसब्री से इंतजार कर रहे हैं जिस दिन हम अपने उपयोगकर्ताओं से दंगा किए बिना सामान्य कनेक्शन पर वापस जा सकते हैं।


2
मुझे उम्मीद है कि मैंने इस उत्तर को चलने से पहले पढ़ा थाSELECT orders.* FROM orders LEFT JOIN items USING(item_id)
एस्ट डेरेक

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

मैं उत्सुक हूं @Charles ... क्या आपका मुद्दा कभी हल हुआ था?
चचलैक

@MichaelDibbets हमने कुछ महीने पहले एप्लिकेशन सर्वर को बदल दिया था, और यह देखने के लिए कि क्या तीन सेकंड बग अभी भी आसपास था, को बदल दिया गया। यह नहीं था यह प्रॉक्सी द्वारा हल किया गया है, मुझे लगता है। के संबंध में नीचे इस सवाल का जवाब mysqli_change_userअभी भी शायद लोगों की है कि के लिए सबसे अच्छा समाधान नहीं है है नहीं राज्य की समस्याओं से निपटने के लिए बनाया गया एक आवेदन में लगातार कनेक्शन करने के लिए।
चार्ल्स

5
हमारे पास कनेक्ट पर 5 सेकंड की देरी थी, जिसे हम DNS + IPv6 समस्या के रूप में अलग करने में कामयाब रहे। सर्वर v6 पते की तलाश कर रहा था, विफल हो रहा था, और फिर IPv4 पते का उपयोग कर रहा था।
निगेल एटकिंसन

45

ऊपर चार्ल्स की समस्या के जवाब में,

से: http://www.php.net/manual/en/mysqli.quickstart.connections.php -

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

Mysqli एक्सटेंशन एक स्थिर कनेक्शन की दोनों व्याख्याओं का समर्थन करता है: पुन: उपयोग करने से पहले स्थिति बनी रहती है, और राज्य रीसेट होता है। डिफ़ॉल्ट रीसेट है। एक निरंतर कनेक्शन का पुन: उपयोग करने से पहले, mysqli एक्सटेंशन mysqli_change_user()राज्य को रीसेट करने के लिए अंतर्निहित कॉल करता है। लगातार कनेक्शन उपयोगकर्ता के लिए प्रकट होता है जैसे कि इसे अभी खोला गया था। पिछले उपयोगों की कोई कलाकृतियाँ दिखाई नहीं देती हैं।

mysqli_change_user()समारोह एक महंगी ऑपरेशन है। सर्वश्रेष्ठ प्रदर्शन के लिए, उपयोगकर्ता कंपाइल फ़्लैग के साथ एक्सटेंशन को फिर से MYSQLI_NO_CHANGE_USER_ON_PCONNECTस्थापित करना चाह सकते हैं ।

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


+1, यदि इस तथ्य के लिए नहीं कि हमने अन्य तरीकों से गड़बड़ी को साफ किया है, तो मुझे यह देखना अच्छा लगेगा कि मैन्युअल रूप से कॉलिंग change_user ने हमारे विचित्र अज्ञात-राज्य मुद्दों को निर्धारित किया होगा।
चार्ल्स

पीडीओ पोस्टग्रेज के लगातार कनेक्शन के बराबर क्या है? मेरे पास इसी तरह के मुद्दे हैं जैसे @Charles था, जहां थोड़ी देर के बाद उपयोगकर्ताओं को त्रुटि प्राप्त होगी जैसे कि sql - सर्वर ने कनेक्शन को अनपेक्षित रूप से बंद कर दिया है। इसका मतलब है कि सर्वर का चयन असामान्य रूप से किया जाता है जब सरल चयन क्वेरी (लेनदेन भी नहीं) चल रहा हो।
कार्मेगेडन

1
@Carmageddon, यह एक नए प्रश्न के लिए अधिक अनुकूल है, लेकिन tl; ड्र है कि पोस्टग्रैज पोकनेक्ट नहीं करता है और आपको इसके बजाय बाहरी कनेक्शन पूल में से एक का उपयोग करना चाहिए।
चार्ल्स

@ घर, तुम क्या मतलब है? "बाहरी कनेक्शन पूल" का उपयोग करने के बराबर नहीं पीडीओ के लगातार कनेक्शन का उपयोग कर रहा है? या आपका क्या मतलब था?
कार्मेगेडन

@Carmageddon, मेरा क्या मतलब है कि पोस्टग्रेज समुदाय कनेक्शन पूलिंग पर पोकनेक्ट से बेहतर समाधान के रूप में बसे। Pgbouncer या pgpool-II देखें। मुझे यकीन नहीं है कि पीडीओ पोस्टग्रैस को वैसे भी पोकनेक्ट करता है, लेकिन मैं अपने रॉकर को पूरी तरह से बंद कर सकता हूं।
चार्ल्स

13

स्थायी कनेक्शन केवल एक अच्छा विचार है, जब आपके डेटाबेस से जुड़ने में लंबा (अपेक्षाकृत) समय लगता है। आजकल लगभग कभी ऐसा नहीं होता। लगातार कनेक्शन के लिए सबसे बड़ी कमी यह है कि यह उन उपयोगकर्ताओं की संख्या को सीमित करता है जिन्हें आप अपनी साइट ब्राउज़ कर सकते हैं: यदि MySQL केवल 10 समवर्ती कनेक्शनों को एक बार में अनुमति देने के लिए कॉन्फ़िगर किया गया है, जब कोई 11 वां व्यक्ति आपकी साइट को ब्राउज़ करने का प्रयास करता है तो यह उनके लिए काम नहीं करेगा। ।

पीडीओ दृढ़ता का प्रबंधन नहीं करता है। MySQL ड्राइवर करता है। जब वे उपलब्ध हों तो यह कनेक्शन का पुन: उपयोग करता है और होस्ट / उपयोगकर्ता / पासवर्ड / डेटाबेस मैच। यदि कोई परिवर्तन होता है तो यह एक कनेक्शन का पुन: उपयोग नहीं करेगा। सबसे अच्छा मामला शुद्ध प्रभाव यह है कि आपके द्वारा शुरू किए गए इन कनेक्शनों को इतनी बार बंद कर दिया जाएगा क्योंकि आपके पास साइट पर अलग-अलग उपयोगकर्ता हैं और उन्हें लगातार बनाये रखना कोई अच्छा काम नहीं करता है।

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

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

PHP की प्रक्रियात्मक mysql लाइब्रेरी, में एक सुविधा है जिसके द्वारा mysql_connect को बाद की कॉलें एक ही लिंक लौटाएगी, बजाय एक अलग कनेक्शन खोलने के (जैसा कि कोई उम्मीद कर सकता है)। इसका लगातार कनेक्शन से कोई लेना-देना नहीं है और यह mysql लाइब्रेरी के लिए विशिष्ट है। पीडीओ इस तरह के व्यवहार का प्रदर्शन नहीं करता है


संसाधन लिंक: लिंक

सामान्य तौर पर आप इसे एक मोटे नियम के रूप में इस्तेमाल कर सकते हैं ::

हाँ , लगातार कनेक्शन का उपयोग करें, यदि:

  • डेटाबेस तक पहुंचने वाले कुछ ही एप्लिकेशन / उपयोगकर्ता हैं, अर्थात आप 200 खुले (लेकिन शायद निष्क्रिय) कनेक्शन में परिणाम नहीं करेंगे, क्योंकि एक ही होस्ट पर 200 विभिन्न उपयोगकर्ता साझा हैं।
  • डेटाबेस किसी अन्य सर्वर पर चल रहा है जिसे आप नेटवर्क पर एक्सेस कर रहे हैं

  • एक (एक) अनुप्रयोग बहुत बार डेटाबेस तक पहुँचता है

नहीं , लगातार कनेक्शन का उपयोग न करें, यदि:

  • आपके एप्लिकेशन को केवल एक घंटे में 100 बार डेटाबेस तक पहुंचने की आवश्यकता है।

  • आपके पास कई, एक डेटाबेस सर्वर तक पहुंचने वाले कई वेबसर्वर हैं

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

इसके साथ समस्या यह है कि, "डिफ़ॉल्ट कॉन्फ़िगरेशन" में, MySQL केवल 1000 समानांतर "ओपन चैनल" की अनुमति देता है। उसके बाद, नए कनेक्शन मना कर दिए जाते हैं (आप इस सेटिंग को ट्वीक कर सकते हैं)। इसलिए यदि आपके पास - प्रत्येक 100 ग्राहकों के साथ 20 Webservers हैं, और उनमें से प्रत्येक के पास प्रति घंटे केवल एक पृष्ठ एक्सेस है, तो साधारण गणित आपको दिखाएगा कि आपको डेटाबेस में 2000 समानांतर कनेक्शनों की आवश्यकता होगी। यह काम नहीं करेगा।

एर्गो: केवल बहुत सारे अनुरोध वाले अनुप्रयोगों के लिए इसका उपयोग करें।


4
लाइन के बाद आपका उत्तर स्टैकओवरफ्लो से कॉपी पेस्ट है। / a / 151583/718224
टोनी स्टार्क

1
"हाँ, लगातार कनेक्शन का उपयोग करें, अगर: [...] केवल कुछ एप्लिकेशन / उपयोगकर्ता डेटाबेस का उपयोग कर रहे हैं" के साथ विरोधाभास "केवल बहुत सारे अनुरोधों के साथ अनुप्रयोगों के लिए इसका उपयोग करें।" उत्तरार्द्ध हालांकि सही है। स्थिति: प्रति सेकंड हजारों अनुरोधों के परिणामस्वरूप सैकड़ों सक्रिय डेटाबेस कनेक्शन मिलेंगे। जब कोई सिस्टम रैखिक रूप से स्केल करता है, तो यह डेटाबेस में कनेक्शन की मात्रा को रैखिक रूप से मापेगा। इसलिए अधिक अनुरोधों (अधिक उपयोगकर्ता) के परिणामस्वरूप अधिक कनेक्शन मिलेंगे। तो अगर आप की जरूरत है सीमित अभी तक कई सक्रिय कनेक्शन आप (उपयोगकर्ता) अनुरोध के बहुत सारे है, जब (!)
केन वान Hoeylandt

12

मेरे परीक्षणों पर मेरे पास अपने स्थानीय होस्ट के लिए एक सेकंड से अधिक का कनेक्शन समय था, इस प्रकार यह मानते हुए कि मुझे लगातार कनेक्शन का उपयोग करना चाहिए। आगे के परीक्षणों से पता चला कि यह 'लोकलहोस्ट' के साथ एक समस्या थी:

सेकंड में परीक्षण के परिणाम (php माइक्रोटाइम द्वारा मापा जाता है):

  • होस्ट किया गया वेब: कनेक्टडीबी: 0.0038912296295166
  • localhost: connectDB: 1.0214691162109 (एक सेकंड से अधिक: लोकलहोस्ट का उपयोग न करें!)
  • 127.0.0.1: कनेक्टडीबी: 0.00097203254699707

दिलचस्प है: निम्नलिखित कोड 127.0.0.1 का उपयोग करते हुए उतना ही तेज़ है:

$host = gethostbyname('localhost');
// echo "<p>$host</p>";
$db = new PDO("mysql:host=$host;dbname=" . DATABASE . ';charset=utf8', $username, $password,
    array(PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

पीडीओ की तरह लगता है कि डोमेन नाम का अनुवाद करने में कठिनाई होती है! धन्यवाद, मैं सोच रहा था कि प्रत्येक कनेक्शन मेरे क्वाड कोर मशीन पर लंबे समय तक क्यों ले रहा था!
मुस्तफा

@ गुन्नार बर्नस्टीन +1 अच्छा लगता है। "लोकलहोस्ट" निश्चित रूप से अधिक समय लेता है और इससे मेरे वेब ऐप की गति में कुछ हद तक सुधार हुआ है (यह बहुत सारे कनेक्शन बनाता है)।
अफीम 2335

1
यह भी खूब रही। मेरे विकास मशीन पर संकल्प के साथ कुछ गलत है ... एक आईपी का उपयोग मेरी स्क्रिप्ट 6.1s से 1.1s तक ले गया
पीट

localhostसॉकेट कनेक्शन का उपयोग करता है, सॉकेट कनेक्शन कनेक्शन की बड़ी मात्रा में खराब होने के लिए प्रसिद्ध है
mente

@ कोई संदर्भ, संसाधन जो उस तथ्य को साबित कर सकता है? मुझे लगता है कि यूडीएस को टीसीपी से अधिक पसंद किया जाता है। धन्यवाद।
नक्सविन

6

लगातार कनेक्शन एक बड़े प्रदर्शन को बढ़ावा देना चाहिए। मैं इस बात से असहमत हूं कि आपको "दृढ़ता" से बचना चाहिए।

ऐसा लगता है कि उपरोक्त शिकायतें किसी को MyIASM तालिकाओं का उपयोग करके और लेन-देन के अपने स्वयं के संस्करणों में हैक करके टेबल लॉक्स को हथियाने से प्रेरित हैं .. खैर आप गतिरोध के लिए जा रहे हैं! PDO की शुरुआत () का उपयोग करें और अपनी तालिकाओं को InnoDB पर ले जाएँ ..


2
एक साल देर से, मुझे एहसास हुआ, लेकिन रिकॉर्ड के लिए: मेरी कहानी पूरी तरह से अनुक्रमणिका समर्थन के लिए MyISAM के दलदल में फंसे एक मुट्ठी भर क्लोन के एकमात्र अपवाद के साथ पूरी तरह से InnoDB तालिकाओं से बना डेटाबेस से आती है ।
चार्ल्स

Pfft, Sphinx पुराना और पर्दाफाश करने वाला है, ElasticSearch नया हॉटनेस है। एक अच्छा दिन, हम वास्तव में इसका इस्तेमाल सिर्फ नए के बजाय अपने पुराने ऐप के लिए करेंगे ...
चार्ल्स

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

2
MySQL 5.6 InnoDB तालिकाओं के लिए पूर्ण समर्थन प्रदान करता है।
टाइमऑफली

2

मुझे लगता है कि एक निरंतर कनेक्शन होने से अधिक सिस्टम संसाधनों को खा जाएगा। शायद एक तुच्छ राशि, लेकिन फिर भी ...


अक्सर कंप्यूटर के समय के माइक्रोसेकंड के लिए बहुत सारे मानव समय का व्यापार
एंडी चेस

1

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

लगातार कनेक्शन के साथ पहली परेशानी ...

यदि आप प्रति सेकंड 1000 के कनेक्शन बना रहे हैं, तो आप आमतौर पर यह सुनिश्चित नहीं करते हैं कि यह बहुत लंबे समय तक खुला रहता है, लेकिन ऑपरेशन सिस्टम करता है। टीसीपी / आईपी प्रोटोकॉल के आधार पर पोर्ट्स को तुरंत पुनर्नवीनीकरण नहीं किया जा सकता है और उन्हें पुनर्नवीनीकरण होने से पहले "फिन" चरण में कुछ समय का निवेश करना होगा।

दूसरी समस्या ... बहुत सारे MySQL सर्वर कनेक्शन का उपयोग करना।

बहुत से लोग बस महसूस नहीं करते हैं कि आप * max_connections * चर को बढ़ाने में सक्षम हैं और MySQL के साथ 100 से अधिक समवर्ती कनेक्शन प्राप्त करते हैं, जो कि MySQL के साथ 1024 से अधिक कनेक्शनों को व्यक्त करने में असमर्थता की पुरानी लिनक्स समस्याओं से पीड़ित थे।

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

MySQL 3.22 / 3.23 के दौरान लगातार कनेक्शन PHP में डाले गए जब MySQL इतना मुश्किल नहीं था, जिसका मतलब है कि आप बिना किसी समस्या के आसानी से कनेक्शन रीसायकल कर सकते हैं। हालाँकि, बाद के संस्करणों में समस्याओं की मात्रा के बारे में आया - क्या आपको उस कनेक्शन को रीसायकल करना चाहिए, जिसमें आपके द्वारा बिना लेन-देन किए मुसीबत में डाल दिया गया हो। यदि आप कस्टम कैरेक्टर सेट कॉन्फ़िगरेशन के साथ कनेक्शन रीसायकल करते हैं तो आप फिर से खतरे में पड़ जाते हैं, साथ ही संभवतः प्रति सेशन चर में रूपांतरित हो जाते हैं।

लगातार कनेक्शन का उपयोग करने के साथ एक परेशानी यह है कि वास्तव में अच्छी तरह से पैमाने पर नहीं है। उन लोगों के लिए जिनके पास 5000 लोग जुड़े हुए हैं, आपको 5000 लगातार कनेक्शन की आवश्यकता होगी। दृढ़ता की आवश्यकता को दूर करने के लिए, आपके पास 10000 लोगों को समान मात्रा में कनेक्शन देने की क्षमता हो सकती है क्योंकि वे व्यक्तियों के कनेक्शन को साझा करने की स्थिति में होते हैं जब वे उनके साथ नहीं होते हैं।


0

मैं बस सोच रहा था कि क्या एक आंशिक समाधान का उपयोग-एक बार कनेक्शन का पूल होगा। आप एक कनेक्शन पूल बनाने में समय व्यतीत कर सकते हैं जब सिस्टम कम उपयोग पर होता है, एक सीमा तक, उन्हें हाथ से बाहर निकाल दें और जब वे पूरा हो जाए या समय समाप्त हो जाए तो उन्हें मार दें। पृष्ठभूमि में आप नए कनेक्शन बना रहे हैं जैसा कि वे ले जा रहे हैं। सबसे खराब स्थिति में यह केवल पूल के बिना संबंध बनाने के रूप में धीमा होना चाहिए, यह मानते हुए कि लिंक स्थापित करना सीमित कारक है?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.