我正在运行一个springboot应用程序来创建restapi。我经常会收到一个错误,说数据库连接已关闭,然后我就无法对应用程序进行任何调用。我用的是Postgres数据库。这是完整的堆栈跟踪:
org.springframework.transaction.CannotCreateTransactionException:无法为事务打开JPA EntityManager;嵌套异常为javax.persistence.PersistenceException:org.hibernate.TransactionException:JDBC begin transaction失败:
位于org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431)
位于org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
在org.springframework.transaction.interceptor.TransactionSpectSupport.CreateTransactionIfEssential(TransactionSpectSupport.java:457)上
位于org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:276)
位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:179)上
位于org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
位于com.sun.proxy.$Proxy91.findByUriMoniker(未知来源)
在com.mypkg.businessobjects.OrderInfoBO.getOrderInfo(OrderInfoBO.java:76)上
在com.mypkg.controller.OrderInfoController.getOrderInfo(OrderInfoController.java:78)
位于sun.reflect.GeneratedMethodAccessor104.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:483)
位于org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
位于org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
位于org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
位于org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777)
位于org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706)
位于org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
位于org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
位于org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
位于org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
位于org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
位于org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
位于io.undertow.servlet.handlers.ServletHandler.HandlerRequest(ServletHandler.java:85)
位于io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130)
位于com.mypkg.config.CORSFilter.doFilter(CORSFilter.java:39)
位于io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
位于io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
位于org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
位于org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
位于io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
位于io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
位于io.undertow.servlet.handlers.FilterHandler.HandlerRequest(FilterHandler.java:85)
位于io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.HandlerRequest(ServletSecurityRoleHandler.java:61)
位于io.undertow.servlet.handlers.ServletDispatchingHandler.HandlerRequest(ServletDispatchingHandler.java:36)
位于io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
位于io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.HandlerRequest(ServletAuthenticationCallHandler.java:56)
位于io.undertow.server.handlers.PredicateHandler.HandlerRequest(PredicateHandler.java:43)
位于io.undertow.security.handler.AbstractSecretentityHandler.HandlerRequest(AbstractSecretentityHandler.java:45)
位于io.undertow.servlet.handlers.security.ServletSecretentityConstraintHandler.HandlerRequest(ServletSecretentityConstraintHandler.java:63)
在io.undertow.security.handler.AuthenticationMechanismsHandler.HandlerRequest(AuthenticationMechanismsHandler.java:58)
位于io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.HandlerRequest(CachedAuthenticatedSessionHandler.java:70)
位于io.undertow.security.handlers.SecurityInitialHandler.HandlerRequest(SecurityInitialHandler.java:76)
位于io.undertow.server.handlers.PredicateHandler.HandlerRequest(PredicateHandler.java:43)
位于io.undertow.server.handlers.PredicateHandler.HandlerRequest(PredicateHandler.java:43)
位于io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261)
位于io.undertow.servlet.handlers.ServletiInitialHandler.dispatchRequest(ServletinInitialHandler.java:247)
位于io.undertow.servlet.handlers.ServletiInitialHandler.access$000(ServletiInitialHandler.java:76)
在io.undertow.servlet.handlers.ServletInitialHandler$1.HandlerRequest(ServletInitialHandler.java:166)
位于io.undertow.server.Connectors.executeRootHandler(Connectors.java:197)
在io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
运行(Thread.java:745)
原因:javax.persistence.PersistenceException:org.hibernate.TransactionException:JDBC begin事务失败:
位于org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
位于org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
位于org.hibernate.jpa.spi.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1771)
位于org.hibernate.jpa.internal.TransactionImpl.begin(TransactionImpl.java:64)
位于org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:159)
位于org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380)
... 56多
原因:org.hibernate.TransactionException:JDBC begin事务失败:
位于org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:76)
位于org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:162)
位于org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1435)
位于org.hibernate.jpa.internal.TransactionImpl.begin(TransactionImpl.java:61)
... 58多
原因:org.postgresql.util.PSQLException:此连接已关闭。
位于org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:833)
位于org.postgresql.jdbc2.AbstractJdbc2Connection.getAutoCommit(AbstractJdbc2Connection.java:794)
位于sun.reflect.GeneratedMethodAccessor35.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:483)
位于org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126)
位于org.apache.tomcat.jdbc.pool.jdbceptor.invoke(jdbceptor.java:108)
位于org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:81)
位于com.sun.proxy.$Proxy56.getAutoCommit(未知源)
位于org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:68)
... 61多
当我重新启动应用程序时,它就会消失。我想这个问题发生在我重新启动postgres DB时。为什么会这样
这是其他帖子回答的一半,我想非常明确。我还想更像春天的靴子。如有必要,请随时更改时间间隔
选项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.execution运行间隔时间毫秒=60000
选项3:主动丢弃空闲连接。
使用这些属性(注意:我找不到有关Spring Boot的可靠文档。超时时间以秒为单位,而不是以毫秒为单位):
spring.datasource.remove废弃=true
spring.datasource.remove放弃超时=60
开机快乐