2010-07-29 13 views
8

सर्वर को रिबूट करने के बाद सर्वर को टॉमकैट सर्वर से ओरेकल कनेक्शन हर रात बाहर निकालने के बाद। रीबूट से पहले, कनेक्शन टाइमआउट नहीं था। अब, सुबह में आवेदन डीबी तक पहुंचने वाली जेडीबीसी कनेक्शन त्रुटि फेंकता है। टॉमकैट को पुनरारंभ करने से समस्या ठीक हो जाती है। मुझे लगता है कि कनेक्शन फिर से स्थापित होने के कारण है। मुझे लगता है कि यह सत्र के बाहर ओरेकल डीबी के कारण है। ओरेकल 11 जी में सत्र टाइमआउट कैसे अक्षम किया जा सकता है?
धन्यवाद!
स्टीवओरेकल 11 जी सत्र टाइमआउट

dev.g परीक्षण के साथ Config.groovy।

dataSource { 
    pooled = true 
} 

hibernate { 
    cache.use_second_level_cache = true 
    cache.use_query_cache = true 
    cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider' 
} 

// environment specific settings 
environments { 
production { 
    dataSource { 
    driverClassName = "oracle.jdbc.driver.OracleDriver" 
    username = "XXXXX" 
    password = "XXXXXX" 
    dialect = "org.hibernate.dialect.Oracle10gDialect" 
    dbCreate = "update" // one of 'create', 'create-drop','update' 
    url = "jdbc:oracle:thin:@XXXXXX:1521:xxxx" 
    } 
} } 
+1

क्या यह एक grails आवेदन tomcat पर चल रहा है? –

+0

हाँ - Grails 1.2.2, RHEL 5.5, टोमकैट 6.0.26 – ptsw

उत्तर

12

आमतौर पर उपयोगकर्ता टोमकैट से जुड़े प्रोफाइल द्वारा नियंत्रित किया जाता है।

SQL> SELECT PROFILE, LIMIT FROM DBA_PROFILES WHERE RESOURCE_NAME = 'IDLE_TIME'; 

PROFILE      LIMIT 
------------------------------ ---------------------------------------- 
DEFAULT      UNLIMITED 

SQL> SELECT PROFILE FROM DBA_USERS WHERE USERNAME = USER; 

PROFILE 
------------------------------ 
DEFAULT 

तो जिस उपयोगकर्ता से मैं कनेक्ट हूं, असीमित निष्क्रिय समय है - कोई समय नहीं।

+0

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

0

क्या डीबी को पता है कि कनेक्शन गिरा दिया गया है, या सत्र अभी भी v $ सत्र में सूचीबद्ध है? यह इंगित करेगा, मुझे लगता है कि यह नेटवर्क द्वारा गिरा दिया जा रहा है। क्या आपको पता है कि समस्या का सामना करने से पहले यह कितना समय तक निष्क्रिय रह सकता है, और यदि वह टीसीपी निष्क्रिय मूल्यों (net.ipv4.tcp_keepalive_time, tcp_keepalive_probes और tcp_keepalive_interval से sysctl से कोई समानता है तो मुझे सही याद आती है)? याद नहीं है कि sysctl परिवर्तन डिफ़ॉल्ट रूप से जारी रहता है, लेकिन यह कुछ ऐसा हो सकता है जिसे संशोधित किया गया था और फिर रीबूट द्वारा रीसेट किया गया था।

इसके अलावा आप पूरे सर्वर को बाउंस किए बिना अपने जेडीबीसी कनेक्शन रीसेट करने में सक्षम हो सकते हैं; निश्चित रूप से WebLogic में कर सकते हैं, जो मुझे एहसास है कि ज्यादा मदद नहीं करता है, लेकिन मैं टोमकैट समकक्ष से परिचित नहीं हूं।

+0

एलेक्स, मैंने केवल LOGON_TIME> अंतिम टॉमकैट पुनरारंभ के साथ सत्र देखा। यदि नेटवर्क सत्र समाप्त कर रहा था, तो टॉमकैट पुनरारंभ होने के बावजूद, उन सत्रों को अभी भी तालिका में होना चाहिए। सही? sysctl जानकारी: net.ipv4.tcp_keepalive_intvl = 75 net.ipv4.tcp_keepalive_probes = 9 net.ipv4.tcp_keepalive_time = 7200 – ptsw

+0

हाँ, बिलाव पुनः आरंभ किसी भी पुराने अनाथ सत्र को प्रभावित नहीं करेगा। मुझे लगता है कि ओरेकल ध्यान दे रहा था कि वे थोड़ी देर के बाद मर चुके हैं और उन्हें समाप्त कर रहे हैं, पूरी तरह से स्वतंत्र रूप से अपने ग्राहक के अंत को बंद कर रहे हैं (केवल डेटा भरने की कोशिश करते समय); हमारे पास एक जेडीबीसी क्लाइंट ऐप है जो रिमोट डीबी को बाउंस करने के कई घंटों की तरह व्यवहार करता है, लेकिन मुझे यकीन है कि कई बदलाव हैं। आपको टाइमआउट के बाद सीधे v $ सत्र में क्या देखना है, लेकिन जैसा कि यह ज्ञात नहीं है और कभी-कभी रातोंरात कठिन होता है। मुझे लगता है कि वी $ सत्र की निगरानी करें और देखें कि वे कब बंद हो जाते हैं? शुभकामनाएँ ... –

2

एडम पहले ही डेटाबेस प्रोफाइल का सुझाव दे चुका है।

आप SQLNET.ORA फ़ाइल देख सकते हैं। EXPIRE_TIME पैरामीटर है लेकिन यह मौजूदा लोगों को समाप्त करने के बजाय खोए गए कनेक्शन का पता लगाने के लिए है।

यह रातोंरात होता है, यह एक निष्क्रिय टाइमआउट की तरह लगता है, जो ऐप सर्वर और डेटाबेस सर्वर के बीच फ़ायरवॉल पर हो सकता है। EXPIRE_TIME सेट करना हो रहा है कि रोकें (क्योंकि ग्राहक को जीवित रखने के लिए हर 10 मिनट की जांच होगी)।

या संभवतः डेटाबेस बंद हो रहा है और पुनरारंभ किया जा रहा है और यह कनेक्शन को मार रहा है।

वैकल्पिक रूप से, आप एक validationQuery साथ बिल्ला कॉन्फ़िगर करने के लिए इतना है कि यह स्वचालित रूप से एक बिल्ला के बिना कनेक्शन पुन: प्रारंभ होगा पुनः आरंभ

+0

गैरी, sqlnet.ora फ़ाइल में वास्तव में मेरे सिस्टम पर बहुत कुछ नहीं है। इसमें केवल दो चर परिभाषित हैं - NAMES.DIRECTORY_PATH और ADR_BASE। क्या यह आपके लिए सही लगता है? - स्टीव – ptsw

+0

सामान्य लगता है। एक expire_time के बिना, ओरेकल आम तौर पर नोटिस नहीं करेगा कि क्लाइंट कनेक्शन समाप्त हो जाता है जब तक कि यह किसी के बीच में न हो। यदि v $ सत्र प्रविष्टियां चारों ओर लटकती नहीं हैं, तो ऐसा लगता है कि वे जानबूझकर क्लाइंट ऐप बंद हो रहे हैं। –

2

यह संभावना आपके आवेदन के कनेक्शन पूल के कारण होता है में सक्षम होना चाहिए; ओरेकल डीबीएमएस मुद्दे नहीं। अधिकांश कनेक्शन पूल में एक वैध कथन होता है जो आपको कनेक्शन देने से पहले निष्पादित कर सकता है। ऑरैकल में आप "दोहरी से 1 का चयन करें" चाहते हैं।

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

मान्य क्वेरी उदाहरण:

<Resource name="jdbc/EmployeeDB" auth="Container" 
      validationQuery="Select 1 from dual" type="javax.sql.DataSource" username="dbusername" password="dbpassword" 
      driverClassName="org.hsql.jdbcDriver" url="jdbc:HypersonicSQL:database" 
      maxActive="8" maxIdle="4"/> 

संपादित करें: Grails के मामले में, वहाँ grails पूल के लिए इसी तरह के विन्यास विकल्प हैं। Grails 1.2 के लिए उदाहरण (Grails 1.2 लिए रिलीज़ नोट्स देखें)

dataSource { 
    pooled = true 
    dbCreate = "update" 
    url = "jdbc:mysql://localhost/yourDB" 
    driverClassName = "com.mysql.jdbc.Driver" 
    username = "yourUser" 
    password = "yourPassword" 
    properties { 
     maxActive = 50 
     maxIdle = 25 
     minIdle = 5 
     initialSize = 5 
     minEvictableIdleTimeMillis = 60000 
     timeBetweenEvictionRunsMillis = 60000 
     maxWait = 10000  
    } 
} 
+0

ब्रायन, सुझाव के लिए धन्यवाद, लेकिन मेरा आवेदन डेटाबेस कॉन्फ़िगरेशन के लिए grails का उपयोग करता है। मुझे नहीं लगता कि टोमकैट विन्यास फाइलें एक भूमिका निभाती हैं। सही? - स्टीव – ptsw

+0

क्या आपके grails डेटाबेस कॉन्फ़िगरेशन पर सही या गलत सेट किया गया है? यदि आपके पास पैरामीटर सेट नहीं है तो डिफ़ॉल्ट सत्य है। यदि पूल किया गया है तो सच है, मैं शर्त लगाता हूं कि पूल मुद्दा है, ओरेकल सत्र नहीं। –

0

चेक अनुप्रयोगों कनेक्शन पूल सेटिंग्स, बल्कि ओरेकल डाटाबेस पर किसी भी सत्र timout सेटिंग्स में फेरबदल से। यह सामान्य है कि वे समय निकालते हैं। http://grails.org/doc/1.0.x/guide/3.%20Configuration.html#3.3%20The%20DataSource

क्या आप वाकई "जमा" पैरामीटर सही ढंग से स्थापित किया है कि कर रहे हैं:

यहाँ एक नज़र है?

नमस्ते, लार्स


संपादित करें:
आपका config पहली झलक पर ठीक लगता है। मैं आज इस मुद्दे पर आया था। शायद यह अपने दर्द से संबंधित है:
"Infinite loop of exceptions if the application is started when the database is down for maintenance"

+0

लार्स, सुझाव के लिए धन्यवाद। मैंने प्रश्न में मेरा Config.groovy जोड़ा। सब कुछ मेरे लिए दिखता है। क्या कुछ गलत आपको बाहर निकलता है? - स्टीव – ptsw

1

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

ऐसा लगता है यह

select 1 from V$SESSION 
where AUDSID = userenv('SESSIONID') and sysdate-LOGON_TIME < 30/24/60 

यह करने के लिए पूल validation query की स्थापना उम्मीद के मुताबिक तरीके से आवेदन को प्रभावित नहीं करता में 30 से अधिक मिनट उम्र बढ़ने सत्र बंद कर देगा द्वारा संभव है।

+0

और यहां जेबॉस एएस के लिए समान सत्यापन क्वेरी है: http://stackoverflow.com/a/32844258/603516 – Vadzim

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