2009-11-10 29 views
7

डेटाबेस में कनेक्शन पूल बनाने (डेटाबेस के बावजूद) बनाने की जानकारी चाहिए, और वे कितने कुशल हैं? वे परिस्थितियां कहां हैं जहां वे प्रदर्शन को बढ़ा सकते हैं।डेटाबेस कनेक्शन पूल बनाना

इसे स्पष्ट रूप से कैसे बनाएं?

उत्तर

3

Apache DBCP को परिचय पृष्ठ यह सार अच्छी तरह से:

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

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

+1

में

<resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/jndiName</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> 

4. उपयोग के बाद से पैदा करेगा बनाने सचिन ने विशेष रूप से पूछा कि पूल प्रदर्शन को संबोधित कर सकते हैं, मैं जोड़ता हूं कि वे आम तौर पर केवल क्ली में समझ में आते हैं एंट-सर्वर एप्लिकेशन, जहां आपके पास उपयोगकर्ताओं की तुलना में कम कनेक्शन हैं। विशेष रूप से, वे एक मोटी-क्लाइंट ऐप में समझ नहीं पाएंगे जहां आपके पास एक उपयोगकर्ता डेटाबेस से कनेक्ट हो रहा है। –

1

बनाना कनेक्शन बहुत महंगा संचालन कर रहे हैं। कनेक्शन पूल डेटाबेस कनेक्शन के उदाहरण हैं जो बनाए और कैश किए जाते हैं। किसी भी समय डेटाबेस के लिए एक नया कनेक्शन वांछित है, पूल से एक नया कनेक्शन बनाने के बजाय उपयोग किया जाता है। कुछ प्लेटफ़ॉर्म जैसे .NET + SQL सर्वर डिफ़ॉल्ट रूप से कनेक्शन पूल का उपयोग करते हैं (आपको अपना स्वयं का निर्माण करने की आवश्यकता नहीं है)। इसलिए, वे मूल रूप से हर बार नए कनेक्शन बनाने में समय बचाकर प्रदर्शन को बढ़ाते हैं।

1

एक कनेक्शन पूल का उपयोग करना, आप हर पहुँच में समय बचेगा, क्योंकि कनेक्शन पहले से ही स्थापित है।

इसके अलावा, कम से कम ओरेकल पर, आप संकलित बयान कनेक्शन से जुड़ा हुआ रखने के लिए, एक ही एसक्यूएल बयान की तो दोहराए निष्पादन भी तेज है।

(PreparedStatement यदि आप जावा/JDBC में हैं)

काउंटर प्रदर्शन का ही खतरा नहीं है जब आप अपने पूल में भी कई निष्क्रिय कनेक्शन, संबद्ध ressources (अपनी तरफ और डेटाबेस पर) रखने बर्बाद हो जाते हैं ।

+0

ध्यान रखें कि कनेक्शन सर्वर में संसाधनों (धागे, बफर) को भी लॉक करते हैं। और एक स्थापित कनेक्शन हमेशा एक विशिष्ट उपयोगकर्ता/पासवर्ड जोड़ी के माध्यम से प्रमाणित किया जाता है। इसलिए यदि कनेक्शन पूलिंग केवल काम करता है, जब सभी कनेक्शन एक ही डेटाबेस खाते का उपयोग करते हैं –

+0

हां आप अद्वितीय डेटाबेस खाता चिंता के साथ पूरी तरह से सही हैं। (उदाहरण के लिए सी/एस एप्लिकेशन से वेब पर माइग्रेट करने में यह समस्या हो सकती है, उदाहरण के लिए, प्राधिकरण डीबी में है, कनेक्टेड उपयोगकर्ता के आधार पर।) – Fouteier

0

डेटाबेस कनेक्शन बनाना है या नहीं एक महंगी आपरेशन, अपने परिवेश और आप इसे साथ क्या करना चाहते हैं पर निर्भर करता है हो सकता है।

आप एक ही बहुत आसान क्वेरी चलाने के लिए जा रहे हैं, तो शायद जोड़ने, तो जब तक (या लंबे समय तक) क्वेरी से लेता है।

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

यदि आप ऐसा करने की योजना बना रहे हैं, कहें, 100 प्रश्न, या कुछ वास्तव में धीमी क्वेरी, तो कनेक्शन का समय महत्वहीन हो जाता है।

आम तौर पर मैं हर बार एक नया कनेक्शन खोलूंगा जब तक आप यह प्रदर्शित नहीं कर सकते कि यह वास्तविक प्रदर्शन समस्या है। कनेक्शन पूलिंग का उपयोग बग, जो हम पसंद नहीं है के लिए नेतृत्व कर सकते हैं:

  • कनेक्शन राज्य पूरी तरह से पूल में पिछले उपयोग के बाद रीसेट नहीं किया गया था - तो कुछ राज्य lingers और एक बग में जिसके परिणामस्वरूप अप्रत्याशित व्यवहार बनाता
  • कनेक्शन किसी तरह (शायद एक स्टेटफुल फ़ायरवॉल टाइमआउट द्वारा), जो पता नहीं किया जा सकता है में बंद हो गया है, इसलिए यदि कोई ऐप्लिकेशन एक बंद कनेक्शन का उपयोग करने, एक लंबे समय से देरी या विफलता
+0

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

1

BoneCP पर एक नज़र डालें के कारण की कोशिश करता है (http://jolbox.com) कुछ संख्याओं के लिए बेंचमार्क खंड में। याद रखें कि तैयार स्टेमेंट्स इत्यादि कनेक्शन से बंधे हैं, इसलिए यदि आप स्वयं कनेक्शन से निपट रहे हैं तो आपको उन्हें बार-बार तैयार करने की आवश्यकता होगी (एक कनेक्शन पूल भी आपके लिए उनको कैश करेगा)।

मेरे सबसे अच्छा समाधान अब तक: एक lazyDataSource कि केवल आप एक कनेक्शन है जब आप वास्तव में उसकी ज़रूरत होती है का उपयोग करें (यानी नहीं आँख बंद करके - डेटा एक कैश से आते हैं तो आप डेटाबेस हिट से बच सकते हैं कर सकते हैं अगर)

6

आपका प्रश्न थोड़ा अस्पष्ट है:

क्या आप होमग्रो कनेक्शन कनेक्शन कार्यान्वयन करना चाहते हैं? यदि ऐसा है, तो यह एक अच्छा प्रारंभिक बिंदु है: http://java.sun.com/developer/onlineTraining/Programming/JDCBook/conpool.htmlलेकिन यह उत्पादन वातावरण के लिए अत्यधिक निराश है। DBCP या C3P0 जैसे मौजूदा और पूरी तरह से परीक्षण किए गए कनेक्शन पूलिंग API का बेहतर उपयोग करें।

या आप जानना चाहते हैं कि एक कनेक्शन पूल का उपयोग कैसे करें? यदि ऐसा है, तो उत्तर आपके द्वारा उपयोग किए जा रहे कनेक्शन पूलिंग API पर निर्भर करता है। यह सौभाग्य से आम तौर पर प्रश्न में एपीआई की वेबसाइट पर उपलब्ध है।

या क्या आप कनेक्शन कनेक्शन का उपयोग करने के लिए कब/ जानना चाहते हैं? यदि ऐसा है, तो यह निश्चित रूप से कनेक्टिंग प्रदर्शन को बढ़ाएगा यदि आपके पास लंबे समय तक रहने वाला एप्लिकेशन (उदा। वेबपृष्ठ) है और आपको अक्सर डेटाबेस से कनेक्ट करने की आवश्यकता है। अधिग्रहण और (बहुत ही विधि ब्लॉक के अंदर अर्थात) कम से कम संभव दायरे में Connection, Statement और ResultSet बंद: सामान्य JDBC अभ्यास अर्थात् है। चूंकि कनेक्टिंग काफी महंगा है और कनेक्शन पूल का उपयोग करके 200 मिमी तक या उससे भी अधिक समय तक लग सकता है। यह मांग पर कनेक्शन देता है और कनेक्शन को बंद करने के बारे में परवाह करता है। हालांकि इसका मतलब यह नहीं है कि आप जेडीबीसी लिखने के तरीके को बदल सकते हैं, आपको अभी भी उन्हें सबसे कम संभव दायरे में हासिल करने और बंद करने की आवश्यकता है। एकमात्र चीज जिसे आप बदलने की जरूरत है वह है जिस तरह से आप कनेक्शन प्राप्त करते हैं। जैसेसे

connection = driverManager.getConnection(); 

को

connection = connectionPool.getConnection(); 

कोई और अधिक परिवर्तन के रूप में लंबे समय के रूप अपने JDBC- कोड अच्छी तरह से लिखा है की जरूरत है बदल जाते हैं।

1

बिल्ला का उपयोग कर कनेक्शन पूल डेटाबेस बनाना

1. बिलाव दर्ज अंदर संसाधन:

<!-- jdbc/jndiName jndi --> 
<Resource name="jdbc/jndiName" auth="Container" type="javax.sql.DataSource" initialSize="1" maxActive="100" maxIdle="30" maxWait="10000" username="enter username" password="enter password" driverClassName="diver name" url="jdbc database url"/> 
: conf/context.xml

context.xml फ़ाइल में संसाधन प्रविष्टियों रखो


2. एक वर्ग जो कनेक्शन पूल

public class MyConnectionFactory { 
    private static String module = "[ QuoteConnectionFactory ]"; 
    private static QuoteConnectionFactory connectionFactory; 

    protected QuoteConnectionFactory() { 
    } 

    /** 
    * 
    * @return=>getInstance() is a static method which will return the instance 
    *      of its own class 
    */ 
    public static QuoteConnectionFactory getInstance() { 
     if (connectionFactory == null) 
      connectionFactory = new QuoteConnectionFactory(); 
     return connectionFactory; 
    } 

    /** 
    * 
    * @param jndiName 

    */ 
    public Connection getConnection(String jndiName) { 
     System.out.println("jndiName=======" + jndiName); 
     Connection conn = null; 
     InitialContext cxt = null; 
     DataSource dataSource = null; 
     try { 
      cxt = new InitialContext(); 
      Context envContext = (Context)cxt.lookup("java:/comp/env"); 
      dataSource = (DataSource)envContext.lookup(jndiName); 
     } catch (NamingException e) { 

     } catch (Exception e) { 

     } 

     if (dataSource == null) { 

      try { 
       conn = dataSource.getConnection(); 
      } catch (Exception e) { 

      } 

      System.out.println("connection===================" + conn); 
      return conn; 
     } 
    } 

3. संपादित web.xml फ़ाइल कोड

Connection con= QuoteConnectionFactory.getInstance(). getConnection("jndiName"); 
संबंधित मुद्दे