2015-01-13 9 views
7

मैं एक वेबपैप पर हाइबरनेट के साथ वसंत का उपयोग कर रहा हूं (हाइबरनेट-core-4.3.8. अंतिम और वसंत 3.2.11.RELEASE)। मैं कनेक्शन पूल इत्यादि के रूप में hikaricp (v 2.2.5) का उपयोग कर रहा हूं जो कनेक्शन रिसाव का पता लगाता है और नीचे स्टैकट्रैस प्रिंट करता है। मैं वसंत की घोषणात्मक लेनदेन सीमा का उपयोग कर रहा हूं इसलिए मुझे लगता है कि संसाधनों का प्रबंधन और सफाई वसंत/हाइबरनेट द्वारा की जाती है। इसलिए, मुझे लगता है कि वसंत या हाइबरनेट पता लगाया कनेक्शन रिसाव का कारण है।वसंत या हाइबरनेट कनेक्शन रिसाव

मूल रूप से, टाइमर होता है जब निकाल दिया जाता है, एक वसंत बीन को @ ट्रान्सैक्शनल एनोटेशन के साथ चिह्नित किया जाता है।

@Transactional public class InvoiceCycleExporter { 
public runExportInvoiceCycleJob(){ 
    //this method when called is **sometimes** leaking a connection .... 
} } 

क्या आप कृपया मुझे कनेक्शन रिसाव के स्रोत का पता लगाने में मदद कर सकते हैं।

2015-01-13 14:25:00.123 [Hikari Housekeeping Timer (pool HikariPool-0)] WARN com.zaxxer.hikari.util.LeakTask - Connection leak detection triggered, stack trace follows 
java.lang.Exception: null 
     at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:139) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final] 
     at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:380) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final] 
     at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:228) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final] 
     at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:171) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final] 
     at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final] 
     at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:162) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final] 
     at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1435) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final] 
     at org.hibernate.jpa.internal.TransactionImpl.begin(TransactionImpl.java:61) ~[hibernate-entitymanager-4.3.8.Final.jar:4.3.8.Final] 
     at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:70) ~[spring-orm-3.2.11.RELEASE.jar:3.2.11.RELEASE] 
     at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:61) ~[spring-orm-3.2.11.RELEASE.jar:3.2.11.RELEASE] 
     at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:378) ~[spring-orm-3.2.11.RELEASE.jar:3.2.11.RELEASE] 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:372) ~[spring-tx-3.2.11.RELEASE.jar:3.2.11.RELEASE] 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:417) ~[spring-tx-3.2.11.RELEASE.jar:3.2.11.RELEASE] 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:255) ~[spring-tx-3.2.11.RELEASE.jar:3.2.11.RELEASE] 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) ~[spring-tx-3.2.11.RELEASE.jar:3.2.11.RELEASE] 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.2.11.RELEASE.jar:3.2.11.RELEASE] 
     at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:633) ~[spring-aop-3.2.11.RELEASE.jar:3.2.11.RELEASE] 
     at com.ukfuels.velos.services.bl.internalinterface.impl.bl.invoicing.**InvoiceCycleExporter (this is the spring bean marked with the transactional annotation)**$$EnhancerBySpringCGLIB$$519c078f.runExportInvoiceCycleJob(<generated>) ~[spring-core-3.2.11.RELEASE.jar:na] 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_65] 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_65] 
     at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:67) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:103) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:71) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:122) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:298) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:117) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.interceptor.BacklogTracerInterceptor.process(BacklogTracerInterceptor.java:84) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:91) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:391) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:273) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:46) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.interceptor.DefaultChannel.process(DefaultChannel.java:335) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:46) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:150) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:117) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.RouteInflightRepositoryProcessor.processNext(RouteInflightRepositoryProcessor.java:48) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.loadbalancer.QueueLoadBalancer.process(QueueLoadBalancer.java:44) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:99) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.processor.loadbalancer.QueueLoadBalancer.process(QueueLoadBalancer.java:71) ~[camel-core-2.11.4.jar:2.11.4] 
     at org.apache.camel.component.quartz.QuartzEndpoint.onJobExecute(QuartzEndpoint.java:113) ~[camel-quartz-2.11.4.jar:2.11.4] 
     at org.apache.camel.component.quartz.CamelJob.execute(CamelJob.java:61) ~[camel-quartz-2.11.4.jar:2.11.4] 
     at org.quartz.core.JobRunShell.run(JobRunShell.java:223) ~[quartz-1.8.6.jar:na] 
     at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549) ~[quartz-1.8.6.jar:na] **(a timer is triggered)** 

उत्तर

0

यहां मुद्दा यह बड़े पैमाने पर चर्चा की है:

https://github.com/brettwooldridge/HikariCP/issues/34

डेटा स्रोत के लिए

मेरी appcontext.xml config, कनेक्शन पूल, entitymanager नीचे

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> 
    <property name="jdbcUrl" value="${jdbc.url}"/> 
    <property name="username" value="${jdbc.user}"/> 
    <property name="password" value="${jdbc.password}"/> 
    <property name="maximumPoolSize" value="${jdbc.maximumPoolSize}"/> 
    <property name="driverClassName" value="org.postgresql.Driver"/> 
    <property name="leakDetectionThreshold" value="${jdbc.leakDetectionThreshold}"/> 
</bean> 

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="shutdown"> 
    <constructor-arg ref="hikariConfig"/> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">   
    <property name="dataSource" ref="dataSource"/> 
    <property name="persistenceUnitName" value="velosPU"/> 
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>  //more stuff .... 
</bean> 

नीचे स्टैकट्रेस हैं

समस्या को कम करने के लिए:

    हाइबरनेट 4 के साथ
  1. कोशिश स्प्रिंग 4
  2. एक और डेटा स्रोत का प्रयास करें यदि समस्या बनी रहती है देखने के लिए।
+0

उत्तर के लिए धन्यवाद। मैं hikari डेटासोर्स से पहले c3p0 डेटासोर्स का उपयोग कर रहा था और रिसाव भी हो रहा था। तो मुझे लगता है कि पोस्टग्रेज़ द्वारा कनेक्शन को समय-समय पर गिरा दिया जा रहा है (संभावना नहीं है क्योंकि postgres.conf और tcux os में संबंधित tcp_keep_alive संबंधित सेटिंग्स ऐसा सुझाव नहीं देते हैं) या वसंत/हाइबरनेट कनेक्शन को ठीक से जारी नहीं कर रहा है। मैं वर्तमान 4.3.8 के रूप में नवीनतम हाइबरनेट का उपयोग कर रहा हूँ। अंतिम। मुझे यकीन नहीं है कि क्या मैं नवीनतम वसंत में अपग्रेड कर सकता हूं लेकिन आगे की जांच कर दूंगा – abdel

+0

यह वसंत बग एसपीआर -12280 से भी संबंधित हो सकता है। – abdel

9

यहां कुछ जानकारी मैं सामान्य

  • नियम बाहर झूठे अलार्म में कनेक्शन लीक डीबगिंग के लिए उपयोगी हो सकती है है। उदाहरण के लिए, यदि आपके पास एक लेनदेन है जो संभावित रूप से 5 मिनट तक चला सकता है (उदाहरण के लिए, बड़ी रिपोर्ट तैयार करते समय) और आपने अपना 'लीकडेटेशन थ्रेसहोल्ड' पैरामीटर सेट किया है (या जो भी आपके चुने हुए पूल कार्यान्वयन के बराबर है) 4 मिनट तक 4 मिनट से अधिक समय लेते हुए किसी लेनदेन को रिसाव के रूप में रिपोर्ट किया जाएगा, भले ही यह वास्तविक रिसाव न हो (लेनदेन पूरी तरह से पूरा हो सकता है और 5 मिनट के बाद सभी कनेक्शन को पर्याप्त रूप से रिलीज़ कर सकता है)।
  • यदि आप कनेक्शन पूल का उपयोग कर रहे हैं लेकिन खुद को कनेक्शन से बाहर चला रहे हैं कभी-कभी तब सोचें कि आप अपने पूल को कैसे कॉन्फ़िगर करते हैं। मेरे मामले में, मैंने पूल को 'maxPoolSize' = 100 के साथ कॉन्फ़िगर किया था। हिकारी ऑटो-डिफॉल्ट 'न्यूनतम आईडी' कॉन्फ़िगरेशन (अधिकतम कनेक्शन की न्यूनतम संख्या जो कि हिकारीसीपी पूल में बनाए रखने की कोशिश करती है) की तरह 'अधिकतमपूलसाइज' की तरह ही पूल को स्टार्ट-अप पर सभी अधिकतम 100 कनेक्शन के साथ शुरू किया जाएगा। लेकिन इसका मतलब यह होगा कि जब 'maxLifetime' (पूल में कनेक्शन का अधिकतम जीवनकाल) आग लगती है, तो सभी कनेक्शनों को को उसी समय पर नवीनीकृत करना होगा। इसके परिणामस्वरूप खड़ी उपलब्ध कनेक्शनों की अस्थायी कमी में परिणाम मिलता है। मेरे लॉग में मैं कभी-कभी निम्नलिखित पंक्तियों को देख रहा था।

    HikariPool -0 (कुल = 100, inuse = 0, लाभ = 100, = 0 प्रतीक्षा में)
    HikariPool -0 (कुल = 4, inuse = 0, लाभ = 4, इंतज़ार कर = 0)
    HikariPool- 0 (कुल = 100, inUse = 0, avail = 100, प्रतीक्षा = 0)

    दूसरी लाइन जहां उपलब्ध कनेक्शन केवल 4 तक गिर गया, वह तब होता है जब 'maxLifetime' तक पहुंच गया था और कनेक्शन नवीकरण की आवश्यकता थी। तो अपने पूल को कॉन्फ़िगर करते समय, इसे एक तरह से करें ताकि कनेक्शन अलग-अलग समय पर समाप्त हो जाए। मेरे मामले में, मैंने बस 'न्यूनतम आईडी' को 40 में बदल दिया, जिसका अर्थ है सर्वर पर लोड बढ़ने के रूप में, नए कनेक्शन बढ़ते अधिग्रहण किए गए (देखें कि आपका पूल इम्प्लाइट मिनीटॉक्वायर संपत्ति के बराबर प्रदान करता है) और इसलिए उन कनेक्शनों की अलग-अलग समाप्ति होगी खजूर।

  • आपका कनेक्शन 'maxLifetime' को आपके डेटाबेस को कनेक्शन के लिए असाइन/अपेक्षाओं से कम होना चाहिए ताकि आप अमान्य पूल में कनेक्शन के साथ समाप्त न हों। अद्यतन: कुछ डेटाबेस समय के बाद कनेक्शन को छोड़ने के लिए मजबूर हो सकते हैं। उदाहरण के लिए, पोस्टग्रेस में 'कनेक्शन टाइमआउट' और 'सॉकेटटाइमआउट' विकल्प होते हैं। तो अपने एप्लिकेशन के कनेक्शन पूल में, आप इस डीबी-लागू-कनेक्शन-टाइमआउट से अधिक लंबे समय तक कनेक्शन नहीं रखना चाहते हैं क्योंकि अन्यथा आप अमान्य/पहले से गिराए गए कनेक्शन को रखेंगे।

+0

क्या आप "कनेक्शन के लिए डेटाबेस असाइन/अपेक्षाओं" पर विस्तार कर सकते हैं? – user7294900

+1

देर से उत्तर के लिए खेद है। असल में कुछ डेटाबेस कुछ समय बाद कनेक्शन छोड़ सकते हैं। उदाहरण के लिए, पोस्टग्रेस में 'कनेक्शन टाइमआउट' और 'सॉकेटटाइमआउट' विकल्प होते हैं। तो अपने एप्लिकेशन के कनेक्शन पूल में, आप इस डीबी-लागू-कनेक्शन-टाइमआउट से अधिक लंबे समय तक कनेक्शन नहीं रखना चाहते हैं क्योंकि अन्यथा आप अमान्य/पहले से गिराए गए कनेक्शन – abdel

+0

धन्यवाद - अपडेट किए जाएंगे। – abdel

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