2011-08-08 15 views
5

यहाँ के साथ फांसी सॉकेट वातावरण है:jTDS C3P0 कनेक्शन की जांच (एसक्यूएल सर्वर 2008 R2)

  • जावा 5
  • वेब अनुप्रयोग विंडोज (नहीं संस्करण यकीन है कि)
  • पर बिलाव 6.0.18 में चल रहा
  • डेटाबेस: एसक्यूएल सर्वर 2008 R2
  • JDBC ड्राइवर: jTDS 1.2.5
  • कनेक्शन पूल प्रदाता: C3P0 0.9.1.2

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

मुझे विश्वास है कि सी 3 पी 0 की "निष्क्रिय जांच क्वेरी" लटक रही है। क्वेरी यह है:

select * from c3p0_connection_test_table 

ऐसा लगता है कि यह क्वेरी चल रही है, और परिणाम कभी वापस नहीं आया है। मैं अपने थ्रेड डंप में जो देखता हूं वह यहां है। सूचना DefaultConnectionTester.activeCheckConnection(), जो बेकार जांच है:

"com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2" daemon prio=6 tid=0x0000000007c32000 nid=0x1250 runnable [0x000000001072f000] 
    java.lang.Thread.State: RUNNABLE 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:129) 
    at java.io.DataInputStream.readFully(DataInputStream.java:178) 
    at java.io.DataInputStream.readFully(DataInputStream.java:152) 
    at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:841) 
    at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java:722) 
    - locked <0x000000016ac03f48> (a java.util.ArrayList) 
    at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.java:466) 
    at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:103) 
    at net.sourceforge.jtds.jdbc.ResponseStream.peek(ResponseStream.java:88) 
    at net.sourceforge.jtds.jdbc.TdsCore.wait(TdsCore.java:3928) 
    at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1045) 
    - locked <0x000000016d965268> (a net.sourceforge.jtds.jdbc.TdsCore) 
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:465) 
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeQuery(JtdsStatement.java:1301) 
    at com.mchange.v2.c3p0.impl.DefaultConnectionTester.activeCheckConnection(DefaultConnectionTester.java:73) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.testPooledConnection(C3P0PooledConnectionPool.java:374) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishIdleResource(C3P0PooledConnectionPool.java:310) 
    at com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask.run(BasicResourcePool.java:1999) 
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) 

लेकिन क्या इस तरह के एक सरल प्रश्न सॉकेट से पढ़ने पर लटका करने के लिए पैदा कर सकता है? मुझे विश्वास नहीं है कि इस तालिका पर कोई डेटाबेस लॉकिंग होगा, क्योंकि यह पूरी तरह से C3P0 द्वारा प्रबंधित है और कभी भी डाला/अपडेट नहीं किया गया है। इसके अलावा, पूल से कनेक्शन प्राप्त करने के किसी भी असफल प्रयास (यदि यह फांसी का कारण था), तो मैं कहीं एक स्टैकट्रैक की अपेक्षा करता हूं। इसके बजाय जो मैं देखता हूं वह ऐप बस लॉक हो रहा है, क्योंकि भविष्य के सभी कनेक्शन अनुरोध इस "निष्क्रिय जांच" को पूरा करने की प्रतीक्षा कर रहे हैं।

यहाँ धागे कि "बेकार की जांच के लिए" इंतज़ार कर रहा है में से एक है पूरा करने के लिए:

"http-80-3" daemon prio=6 tid=0x0000000007c33800 nid=0x122c in Object.wait() [0x000000001082d000] 
    java.lang.Thread.State: WAITING (on object monitor) 
    at java.lang.Object.wait(Native Method) 
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:579) 
    - locked <0x0000000167a88a60> (a com.mchange.v2.resourcepool.BasicResourcePool) 
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) 
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) 
    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81) 
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) 
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) 
    at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142) 
    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85) 
    at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1354) 
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:555) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) 
    at sun.reflect.GeneratedMethodAccessor105.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
    at $Proxy15.getTransaction(Unknown Source) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:317) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
    at $Proxy79.getCrowdProperties(Unknown Source) 
    at com.jamasoftware.contour.gateway.crowd.CrowdSsoServices.autoLogin(Unknown Source) 
    at com.jamasoftware.contour.security.AutoLoginServicesManager.autoLogin(Unknown Source) 
    at org.springframework.security.ui.rememberme.RememberMeProcessingFilter.doFilterHttp(RememberMeProcessingFilter.java:74) 
    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
    at org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:277) 
    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
    at com.jamasoftware.contour.view.filter.CheckSetupFilter.doFilter(Unknown Source) 
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
    at org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter.java:235) 
    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
    at org.springframework.security.concurrent.ConcurrentSessionFilter.doFilterHttp(ConcurrentSessionFilter.java:99) 
    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
    at com.jamasoftware.contour.view.filter.ExpirationFilter.doFilter(Unknown Source) 
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
    at com.jamasoftware.contour.view.filter.GzipFilter.doFilter(Unknown Source) 
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
    at org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:175) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:864) 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579) 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1665) 
    at java.lang.Thread.run(Thread.java:619) 

C3P0 के स्रोत कोड देख से, शीर्ष पर दो पंक्तियों:

at java.lang.Object.wait(Native Method) 
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:579) 

... केवल तभी होता है जब कनेक्शन "निष्क्रिय जांच" की प्रतीक्षा कर रहा हो।

दुर्भाग्य से, यह एक ग्राहक है, और मैं यहां पर्यावरण के सटीक विवरण की रिपोर्ट नहीं कर सकता। लेकिन किसी भी सुझाव जो हम उन्हें अगली कॉल पर ले सकते हैं।

अद्यतन:

उनके आवेदन आज फिर बंद कर दिया गया था। यहां उन चीजें हैं जिन्हें हमने अभी तक आजमाया है:

  • उन्होंने नवीनतम जेटीडीएस ड्राइवर (1.2।5)
  • मैं 300 कनेक्शन स्ट्रिंग पर socketTimeout संपत्ति की स्थापना की है, लेकिन अभी भी ड्राइवर लंबे 5 मिनट के बाद socketRead0() पर अटक रहता
  • हम "c3p0_connection_test_table से चयन *" "का चयन करने से सक्रिय जांच क्वेरी बदल 1 "
  • हम C3P0 को unreturnedConnectionTimeout और debugUnreturnedConnectionStackTraces गुण कर रहे हैं सभी C3P0 कनेक्शन गुण हम निर्धारित किया है को शामिल किया है (इन टूटे हुए कनेक्शन को पकड़ने नहीं कर रहे हैं, हालांकि)

यहाँ:

<property name="minPoolSize" value="1"/> 
    <property name="maxPoolSize" value="30"/> 
    <property name="acquireIncrement" value="3"/> 
    <property name="automaticTestTable" value="c3p0_connection_test_table"/> 
    <property name="idleConnectionTestPeriod" value="30"/> 
    <property name="testConnectionOnCheckin" value="true"/> 
    <property name="testConnectionOnCheckout" value="true"/> 

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

लीड सफलता बिना पीछा किया:

  • This person सर्वर पर एनआईसी कार्ड की संख्या ऑपरेटिंग सिस्टम के साथ एक मुद्दा है, और संभवतः था
  • एक उत्तर देने से नीचे एक पुराने संस्करण में एक बग के लिए मुझे बताया jTDS here की

सहायक जवाब या तो मुझसे पूछते ग्राहक की मशीन पर कुछ पर जाँच करने के लिए, या एक संभव मूल कारण को मुझे इंगित कर सकते हैं। जो भी जवाब मुझे इस ट्रैक को ट्रैक करने में मदद करता है वह बक्षीस प्राप्त करेगा।

उत्तर

2

पहले विचार: जांचें कि वे नवीनतम जेटीडीएस संस्करण का उपयोग कर रहे हैं और SQL सर्वर को नवीनतम एसपी में पैच और अपडेट किया गया है!

जेटीडीएस बग ट्रैकिंग में इस तरह के व्यवहार के बारे में कुछ रिपोर्टें हैं, सबसे विशेष रूप से this one। जाहिर है कि SQL सर्वर कनेक्शन बंद कर रहा है लेकिन जेटीडीएस नोटिस नहीं करता है।

जेटीडीएस के नए संस्करणों में socketTimeoutproperty (डिफ़ॉल्ट = 0) है, शायद यह मदद करता है।

आप एक अलग जेडीबीसी ड्राइवर का परीक्षण भी कर सकते हैं।

+0

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

+0

वे नवीनतम जेटीडीएस (1.2.5) का उपयोग कर रहे हैं, और एसक्यूएल सर्वर नवीनतम एसपी (एसक्यूएल सर्वर 2008 आरसी 2) का एक सुंदर वेनिला इंस्टॉलेशन प्रतीत होता है। मैंने उन्हें सॉकेटटाइम संपत्ति जोड़ दी थी (हमने इसे अत्यधिक 300, या 5 मिनट तक सेट किया), लेकिन फिर भी वे इस मुद्दे को फिर से प्राप्त कर चुके हैं। –

+0

@ सेनाना: 1. 'सॉकेटटाइमआउट' का मान जितना अधिक होगा, कनेक्शन को तोड़ने के लिए जेटीडीएस लगता है ('loginTimeout' के लिए)। 2. चूंकि आपने प्रबंधन स्टूडियो का उपयोग करके कनेक्ट करने में सक्षम नहीं होने का उल्लेख किया है, इसलिए मुझे आश्चर्य होता है कि प्रति उपयोगकर्ता कनेक्शन की कॉन्फ़िगर की गई अधिकतम संख्या क्या है। 3. आर 2 में आर 2 के रूप में? 4. क्या आप एम $ से समर्थन मांगने पर विचार नहीं कर रहे हैं? 5. आप स्थानीय रूप से कनेक्ट कर रहे हैं, क्या आप लोकलहोस्ट सर्वर पते का उपयोग करते हैं? – Vlad

0

jtds का उपयोग करते हुए एसक्यूएल सर्वर से कनेक्ट करते समय मैं c3p0 (0.9.1) लटकाने के साथ एक समान समस्या में भाग गया।

मैंने इसे c3p0 का उपयोग न करके हल किया और जब भी मुझे DriverManager का उपयोग करने की आवश्यकता होती है तो कनेक्शन खोलना। मुझे यकीन है कि यह कलाकार के रूप में नहीं है, लेकिन यह काम करता है।

1

एसक्यूएल सर्वर की जांच में यदि - गुण - कनेक्शन - "उपयोग क्वेरी राज्यपाल लंबे समय से चल प्रश्नों को रोकने के लिए" अक्षम किया गया है

0

वहाँ था भी एक और धागा कनेक्शन जबकि एक कनेक्शन को बंद करने का परीक्षण किया जा रहा था? ऐसा लगता है कि C3P0 c3p0-0.9.2-pre3 में यह तय:

- PooledConnections की आवश्यक परीक्षण आदेश कभी गतिरोध जब रोकने के लिए PooledConnection में उन लोगों के PooledConnections साथ जुड़े ताले के मालिक हैं करने के लिए।बंद करें() कनेक्शन कनेक्शन के साथ मेल खाता है। के लिए इस समस्या पर ध्यान देने के लिए अज्ञात SourceForge उपयोगकर्ता के लिए बहुत धन्यवाद।

से: https://github.com/swaldman/c3p0/blob/master/src/dist-static/CHANGELOG

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