2012-12-06 44 views
15

पर डीबीसीपी में कनेक्शन रिसाव और डेडलॉक्स के साथ समस्याओं के बाद हमने लोड और कमी प्रदर्शन को बढ़ाया, हमने इसे टोमकैट जेडीबीसी-पूल के साथ बदलने का निर्णय लिया। बेशक माइग्रेशन वास्तव में सरल था।डीबीसीपी को टॉमकैट जेडीबीसी-पूल

लेकिन उत्पादन वातावरण पर इसे तैनात करने के बाद मैंने देखा कि दो टॉमकैट चलाने वाले सर्वर पर लोड 4-4.5 से 5.5 तक बढ़ता है। पूल के परिवर्तन को छोड़कर हमने और कुछ नहीं किया। इसके अलावा, जेएमटर के साथ मापा प्रदर्शन लगभग 5% की कमी।

मैंने पूल पैरामीटर को ट्यून करने के लिए कुछ समय बिताया, लेकिन बिना दृश्य प्रभाव के।

<Resource name="jdbc/xxxxxx" 
      auth="Container" 
      type="javax.sql.DataSource" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      initialSize="10" 
      maxActive="100" 
      minIdle="10" 
      maxIdle="50" 
      maxWait="10000" 
      testOnBorrow="true" 
      testOnReturn="false" 
      testOnConnect="false" 
      testWhileIdle="false" 
      validationQuery="SELECT 1 from dual" 
      validationInterval="30000" 
      suspectTimeout="60" 
      timeBetweenEvictionRunsMillis="30000" 
      removeAbandonedTimeout="60" 
      removeAbandoned="true" 
      logAbandoned="true" 
      abandonWhenPercentageFull="50" 
      minEvictableIdleTimeMillis="60000" 
      jmxEnabled="true" 
      username="xxxxx" 
      password="xxxxx" 
      driverClassName="oracle.jdbc.OracleDriver" 
      url="jdbc:oracle:oci:xxxxx"/> 

FairQueue और PoolSweeperEnabled सच

हैं स्प्रिंग applicationContext-jdbc.xml में मैं केवल है:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="resourceRef"> 
     <value>true</value> 
    </property> 
    <property name="jndiName"> 
     <value>java:comp/env/jdbc/PortalDB</value> 
    </property> 
    </bean> 

मैं क्या कर रहा हूँ मैं नीचे (server.xml में <GlobalNamingResources> से) मेरे वर्तमान config चिपकाया गलत कर रहे हो मैंने सोचा, कि जेडीबीसी_पूल बॉक्स के बाहर डीबीसीपी से तेज होना चाहिए।

+0

testWhenIdle = "true" आज़माएं, और अधिकतम 100 की संख्या को 100 से कम करने की कोशिश करें। शायद पूल में बहुत से कनेक्शन होने से चीज़ें धीमा हो रही हैं। –

+1

क्या आप पहले से ही वही सत्यापन क्वेरी का उपयोग कर रहे हैं? – rootkit

+0

@ rootkit007 - नहीं, डीबीसीपी के साथ मैंने चींटी सत्यापन क्वेरी का उपयोग नहीं किया। – Dzinek

उत्तर

0

आपका निदान अजीब है: AFAIK टॉमकैट की डीबीसीपी लिब कॉमन्स-डीबीसीपी का सिर्फ एक पुनर्निर्मित संस्करण है ... इसलिए एक से दूसरे में बदलना व्यवहार या प्रदर्शन में कोई बदलाव नहीं करना चाहिए। (here देखें)

आपके द्वारा उपयोग किए जाने वाले संस्करण (संस्करणों) के बावजूद क्या हो सकता है: विशेष रूप से, 1.3/1.4 मतभेदों से सावधान रहें। (here देखें)

वैसे भी, आपकी कॉन्फ़िगरेशन ठीक प्रतीत होती है (और यह वास्तव में काम करता है, जो आप अनुभव कर सकते हैं)। अपनी libs को अपडेट करना संभवतः डीबग मोड में प्रवेश किए बिना आपकी समस्याओं को हल करने का एकमात्र तरीका था ...

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

+0

ओपी टॉमकैट जेडीबीसी-पूल के बारे में बात कर रहा है, जो कि टॉमकैट के पुनर्निर्मित डीबीसीपी से अलग है। http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html – dnault

1

आपकी सेटिंग्स और ट्यूनिंग सही दिखाई देती है। एक ही समय में अधिक समवर्ती अनुरोधों को संभालने वाले सर्वर के परिणामस्वरूप आपका लोड वृद्धि हो सकती है। डीबीसीपी ने इस लोड को लेने के लिए सर्वर को रोका होगा क्योंकि यह पूल को सभी धागे से कैसे बंद कर देता है। जेडीबीसी-पूल ऐसा नहीं करता है, इसलिए अब आपने अपनी सहमति बढ़ा दी है। और यदि लोड बढ़ता है, तो प्रतिक्रिया कम हो सकती है, लेकिन आपका थ्रूपुट बढ़ जाएगा।

मैं आदेश संगामिति संभाल करने में अपने maxThreads मैच के लिए ट्यूनिंग

maxActive 

शुरू कर दूं।