2015-04-14 17 views
15

में पोस्टग्रेस कनेक्शन बंद कर दिया गया है, मैं आरईएसटी एपिस बनाने के लिए स्प्रिंग बूट एप्लिकेशन चला रहा हूं। अक्सर मुझे यह कहते हुए एक त्रुटि मिलती है कि डेटाबेस कनेक्शन बंद है, और इसके बाद मैं एप्लिकेशन को कोई कॉल नहीं कर सकता। मैं पोस्टग्रेस डीबी का उपयोग कर रहा हूँ। यह पूर्ण स्टैक ट्रेस है:स्प्रिंग बूट

org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: org.hibernate.TransactionException: JDBC begin transaction failed: 
    at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:457) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:276) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy91.findByUriMoniker(Unknown Source) 
    at com.mypkg.businessobjects.OrderInfoBO.getOrderInfo(OrderInfoBO.java:76) 
    at com.mypkg.controller.OrderInfoController.getOrderInfo(OrderInfoController.java:78) 
    at sun.reflect.GeneratedMethodAccessor104.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130) 
    at com.mypkg.config.CORSFilter.doFilter(CORSFilter.java:39) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) 
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85) 
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) 
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) 
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) 
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) 
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63) 
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) 
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) 
    at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261) 
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:247) 
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:76) 
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:166) 
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:197) 
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: javax.persistence.PersistenceException: org.hibernate.TransactionException: JDBC begin transaction failed: 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1771) 
    at org.hibernate.jpa.internal.TransactionImpl.begin(TransactionImpl.java:64) 
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:159) 
    at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380) 
    ... 56 more 
Caused by: org.hibernate.TransactionException: JDBC begin transaction failed: 
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:76) 
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:162) 
    at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1435) 
    at org.hibernate.jpa.internal.TransactionImpl.begin(TransactionImpl.java:61) 
    ... 58 more 
Caused by: org.postgresql.util.PSQLException: This connection has been closed. 
    at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:833) 
    at org.postgresql.jdbc2.AbstractJdbc2Connection.getAutoCommit(AbstractJdbc2Connection.java:794) 
    at sun.reflect.GeneratedMethodAccessor35.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126) 
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:108) 
    at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:81) 
    at com.sun.proxy.$Proxy56.getAutoCommit(Unknown Source) 
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:68) 
    ... 61 more 

जब मैं एप्लिकेशन को पुनरारंभ करता हूं, तो यह दूर हो जाता है। मुझे लगता है कि यह समस्या तब होती है जब मैं अपने पोस्टग्रेज़ डीबी को पुनरारंभ करता हूं। ये क्यों हो रहा है?

उत्तर

9

बहुत मान्य प्रश्न और इस समस्या को आमतौर पर कई लोगों का सामना करना पड़ता है। अपवाद आम तौर पर होता है, जब पूल और डेटाबेस के बीच नेटवर्क कनेक्शन खो जाता है (अधिकांश समय पुनरारंभ करने के कारण)। आपके द्वारा निर्दिष्ट स्टैक ट्रेस को देखते हुए, यह स्पष्ट है कि आप कनेक्शन प्राप्त करने के लिए jdbc pool का उपयोग कर रहे हैं। JDBC pool में विभिन्न कनेक्शन पूल सेटिंग्स को ठीक-ठीक करने के विकल्प हैं और पूल के अंदर क्या हो रहा है इसके बारे में विवरण लॉग इन करें।

आप logAbandoned मापदंडों

टाइमआउट का परित्याग removeAbandoned, removeAbandonedTimeout के लिए

चेक निर्दिष्ट करने के लिए, detailed apache documentation on pool configuration करने का उल्लेख कर सकते साथ ही आप आगे सत्यापन

मजबूत करने के लिए अतिरिक्त गुणों का उपयोग कर सकते

कनेक्शन वैधता के लिए testXXX और validationQuery का उपयोग करें।

+2

क्या यह समाधान आपकी मदद करता है? मुझे एक ही समस्या है, लेकिन इससे मेरी मदद नहीं हुई। –

+0

@ Mark.ewd: यदि अभी भी प्रासंगिक है, तो आप http://stackoverflow.com/a/33660586/56285 – Jonik

+0

स्प्रिंग बूट में कोशिश कर सकते हैं, यदि आप डेटा स्रोत को स्वतः कॉन्फ़िगर करते हैं, तो पूलिंग स्वचालित रूप से कॉन्फ़िगर किया गया है यदि उचित ड्राइवर वर्ग का उपयोग किया जाता है (उदाहरण के लिए org.postgresql.Driver)। आप application.properties में निम्न गुण प्रदान करके पूलिंग समायोजित कर सकते हैं: spring.datasource.test-on-loan = true, spring.datasource.remove-abandoned = true, spring.datasource.validation-query = SELECT 1; –

1

मैं ठीक उसी समस्या, with this setup था, भी उपयोग कर DataSource from Tomcat (org.apache.tomcat.jdbc.pool) Heroku Postgres से कनेक्ट करने के:

org.springframework.transaction.CannotCreateTransactionException: 
    Could not open JPA EntityManager for transaction 
org.hibernate.TransactionException: JDBC begin transaction failed: ] 
    with root cause 
org.postgresql.util.PSQLException: This connection has been closed. 

मेरे लिए इसे हल क्या डेटास्रोत init कोड (a Grails question से उधार को यह जोड़ने था):

dataSource.setTestOnBorrow(true); 
dataSource.setTestWhileIdle(true); 
dataSource.setTestOnReturn(true); 
dataSource.setValidationQuery("SELECT 1"); 

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

जावा डॉक्स स्पष्ट करता है कि क्या हो रहा है: उदा। setTestOnBorrow()। थोड़ा आश्चर्यजनक, शायद, डिफ़ॉल्ट रूप से ऐसा कोई परीक्षण नहीं किया जाता है।

18

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

विकल्प 1: पूल से टूटे कनेक्शन को टॉस करें।

इन गुणों का उपयोग करें:

spring.datasource.test-on-borrow=true 
spring.datasource.validation-query=SELECT 1; 
spring.datasource.validation-interval=30000 

विकल्प 2: पूल में कनेक्शन जिंदा रखें।

उपयोग इन गुणों:

spring.datasource.test-while-idle=true 
spring.datasource.validation-query=SELECT 1; 
spring.datasource.time-between-eviction-runs-millis=60000 

विकल्प 3: पर अग्रिम रूप निष्क्रिय कनेक्शन बाहर टॉस।

spring.datasource.remove-abandoned=true 
spring.datasource.remove-abandoned-timeout=60 

मुबारक बूटिंग:

इन गुणों का उपयोग करें (नोट: मैं वसंत बूट के लिए इस पर विश्वसनीय प्रलेखन ढूँढने में सक्षम नहीं था इसके अलावा समय समाप्ति मिलीसेकेंड नहीं सेकंड में है।)!

+3

स्प्रिंग बूट 1.4 यह थोड़ा और स्पष्ट करता है कि ये सेटिंग्स पूलिंग कार्यान्वयन के लिए विशिष्ट हैं, क्योंकि उन्हें ठीक से पूर्वनिर्धारित करने की आवश्यकता है (उदाहरण के लिए 'spring.datasource.tomcat', 'spring.datasource.dbcp',' spring.datasource। dbcp2', या 'spring.datasource.hikari') बस 'spring.datasource' के बजाय)। वसंत के आराम से बाध्यकारी तब उन्हें अंतर्निहित कनेक्शन पूल कार्यान्वयन के माध्यम से पास कर देगा। सही पूल के लिए दस्तावेज़ों की जांच करें जो आप सही कॉन्फ़िगरेशन पैरामीटर के लिए उपयोग कर रहे हैं ... उपरोक्त देखो tomcat और dbcp के लिए ठीक है लेकिन hikari थोड़ा अलग है। – sworisbreathing

0

मुझे बिल्कुल वही समस्या थी, लेकिन मेरे मामले में उपरोक्त उल्लिखित उत्तरों में मदद नहीं मिली। मुझे पता चला कि एक लंबी क्वेरी करते समय एक ही त्रुटि दिखाई देती है। मेरे मामले में मैंने findAll (Iterable ids) कहा और 100 से अधिक ids की एक बड़ी सूची पारित की। सूची को विभाजित करना (उदा। अपाचे कॉमन्स या Google गुवा से ListUtils का उपयोग करके) और findAll() को कम आईडी के साथ कॉल करना चाल था।