2008-09-24 19 views
30

हमारे पास अलग-अलग सर्वरों पर हमारे जेबॉस और ओरेकल हैं। कनेक्शन गिराए जाने लगते हैं और जेबॉस के साथ समस्याएं पैदा कर रही हैं। अगर कनेक्शन खराब है तो मुझे जेबॉस ओरेकल से फिर से कनेक्ट कर सकता है, जबकि हम समझते हैं कि कनेक्शन पहले स्थान पर क्यों गिराए जा रहे हैं?क्या कनेक्शन खराब होने पर जेबॉस कनेक्शन पूल ओरेकल से फिर से कनेक्ट करने का कोई तरीका है?

उत्तर

25

आमतौर पर उधार पर सत्यापन सत्यापन निष्पादित करने के लिए पूल पर कॉन्फ़िगरेशन विकल्प होता है। यदि सत्यापन क्वेरी सफलतापूर्वक निष्पादित होती है, तो पूल उस कनेक्शन को वापस कर देगा। यदि क्वेरी सफलतापूर्वक निष्पादित नहीं होती है, तो पूल एक नया कनेक्शन बनाएगा।

JBoss Wiki पूल के विभिन्न गुणों को दस्तावेज करता है।

<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql> 

ऐसा लगता है कि यह चाल चलाना चाहिए।

+0

यदि आपके पास पहले से ही आपके सीएफजी में वह रेखा है, तो यह भी जांचें कि आपके पास "वैध-ऑन-मैच" और "पृष्ठभूमि-सत्यापन" दोनों को गलत नहीं है (विवरण के लिए लिंक किए गए विकी पेज देखें)। – Pino

30

जबकि आप पुरानी "दोहरी से चुनिंदा 1 चाल" का उपयोग कर सकते हैं, इसके साथ नकारात्मकता यह है कि जब भी आप पूल से कनेक्शन उधार लेते हैं तो यह एक अतिरिक्त क्वेरी जारी करता है। उच्च मात्रा के लिए, यह अपमानजनक है।

JBoss एक विशेष कनेक्शन सत्यापनकर्ता जो ओरेकल के लिए इस्तेमाल किया जाना चाहिए प्रदान करता है:

<valid-connection-checker-class-name> 
    org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker 
</valid-connection-checker-class-name> 

यह Oracle JDBC कनेक्शन वर्ग पर मालिकाना पिंग() विधि का उपयोग करता है, और निर्धारित करने के लिए ड्राइवर की अंतर्निहित नेटवर्किंग कोड का उपयोग करता है अगर कनेक्शन अभी भी जिंदा है।

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

पृष्ठभूमि जांच को कॉन्फ़िगर करने के लिए wiki docs देखें (background-validation-millis देखें)। - पिंग आधारित और - आधारित

आप आवश्यकता के अनुसार उपयोग कर सकते हैं क्वेरी :

+7

'दोहरी से 1 का चयन करें' और org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker विधि समकक्ष हैं, हालांकि कनेक्शन चेक अबास्ट्रक्शन का स्तर प्रदान करता है। हमें समस्या निवारण अभ्यास के लिए ओरेकल जेडीबीसी ड्राइवरों को अपनाना पड़ा और ओरेकल के कनेक्शन चेक में इस्तेमाल किए गए पिंग के आंतरिक कार्यान्वयन को दोहरी से 'चयन' एक्स 'करना' है। Natch। – abh

+0

ध्यान दें कि 'ओरेकल वैलिडनेक्शन चेकर' में जेबॉस एएस 4 और 5 में एक [मामूली बग] (https://bugzilla.redhat.com/show_bug.cgi?id=699816) था। मुझे यह भी याद है कि इसमें भारी समवर्ती भार के तहत प्रदर्शन समस्याएं थीं हुड के नीचे अलग पिंगर धागे का उपयोग करने के कारण। – Vadzim

5

JBoss 2 तरीके कनेक्शन की वैधता सुनिश्चित करने के लिए प्रदान करता है। यह डेटा स्रोत कॉन्फ़िगरेशन फ़ाइल में परिभाषित अवधि के अनुसार अलग थ्रेड द्वारा निर्धारित किया गया है।

<background-validation>true</background-validation> <background-validation-minutes>1</background-validation-minutes> 

कुछ समय यदि आप Jboss जैसा ओरेकल ड्राइवर होने नहीं कर रहे हैं, तो आप classcast या संबंधित त्रुटि आ सकती है और उस कनेक्शन के लिए कनेक्शन पूल से छोड़ने वालों शुरू हो सकता है। आप org.jboss.resource.adapter.jdbc.ValidConnectionChecker इंटरफ़ेस को लागू करके अपना स्वयं का कनेक्शन वैलिडेटर क्लास बनाने का प्रयास कर सकते हैं। यह इंटरफेस केवल एक विधि 'isValidConnection()' प्रदान करता है और वैध कनेक्शन के बदले 'न्यूल' की अपेक्षा करता है।

उदाहरण के लिए: एक टिप्पणी के लिए

public class OracleValidConnectionChecker implements ValidConnectionChecker, Serializable { 

    private Method ping; 

    // The timeout (apparently the timeout is ignored?) 
    private static Object[] params = new Object[] { new Integer(5000) }; 

    public SQLException isValidConnection(Connection c) { 

     try { 
      Integer status = (Integer) ping.invoke(c, params); 

      if (status.intValue() < 0) { 
       return new SQLException("pingDatabase failed status=" + status); 
      } 

     } 
     catch (Exception e) { 
      log.warn("Unexpected error in pingDatabase", e); 
     } 

     // OK 
     return null; 
    } 
} 
9

पर्याप्त नहीं प्रतिनिधि, तो यह एक जवाब के रूप में है। 'Select 1 from dual' और स्काफमैन की org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker विधि समकक्ष हैं, हालांकि कनेक्शन जांच अबास्ट्रक्शन का स्तर प्रदान करती है। हमें समस्या निवारण अभ्यास के लिए ओरेकल जेडीबीसी ड्राइवरों को अपनाना पड़ा और ओरेकल के पिंग के आंतरिक कार्यान्वयन को 'Select 'x' from dual' करना है। Natch।

2

@ skaffman के उत्तर में थोड़ा अपडेट। JBoss 7 में आप जब वैध कनेक्शन चेकर सेटिंग का उपयोग करने के लिए "वर्ग-नाम" विशेषता है और यह भी पैकेज अलग है:

<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker" />

3

हमने हाल ही में कुछ चल अनुरोध हैंडलिंग विफलताओं अनाथ ओरेकल DBMS_LOCK सत्र ताले की वजह से मिला है जो क्लाइंट-साइड कनेक्शन पूल में अनिश्चित काल तक बरकरार रहा।

<check-valid-connection-sql>select case when 30/60/24 > sysdate-LOGON_TIME then 1 else 1/0 end 
from V$SESSION where AUDSID = userenv('SESSIONID')</check-valid-connection-sql> 

इस पूल से कनेक्शन प्राप्त करने की प्रक्रिया में नीचे कुछ धीमी गति से शामिल हो सकता है:

तो यहाँ एक समाधान है कि 30 मिनट में सत्र समाप्ति बलों लेकिन आवेदन के संचालन को प्रभावित नहीं करता है। लोड के तहत इसका परीक्षण करना सुनिश्चित करें।

+0

बहुत अच्छी चाल है। –

+0

दोस्त यह इतना धीमा है। –

+0

उस 30/60/24 के लिए क्या खड़ा है? –