yet pgconnection org not method implemented createclob conectar con application spring postgresql spring-boot

pgconnection - La conexión de Postgres ha sido cerrada error en Spring Boot



spring boot postgresql (4)

Estoy ejecutando una aplicación Spring Boot para crear apis REST. A menudo recibo un error que dice que la conexión de la base de datos está cerrada, y después de eso no puedo hacer ninguna llamada a la aplicación. Estoy usando Postgres DB. Esta es la traza de pila completa:

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

Cuando reinicio la aplicación, desaparece. Creo que este problema ocurre cuando reinicio mi base de datos postgres. ¿Por qué está pasando esto?


Esta es una especie de respuesta parcial por parte de las otras publicaciones y quería ser muy explícito. También quise ser más Spring-Boot-esque. Siéntase libre de cambiar los intervalos de tiempo según sea necesario.

Opción 1: tirar las conexiones rotas de la piscina.

Usa estas propiedades:

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

Opción 2: mantener vivas las conexiones en la piscina.

Usa estas propiedades:

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

Opción 3: lanzar proactivamente las conexiones inactivas.

Use estas propiedades (Nota: no pude encontrar documentación confiable sobre esto para Spring Boot. Además, el tiempo de espera es en segundos, no en milisegundos):

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

Feliz arranque!


Pregunta muy válida y este problema suele ser afrontado por muchos. La excepción generalmente ocurre cuando la conexión de red se pierde entre el grupo y la base de datos (la mayoría de las veces se debe reiniciar). En cuanto a la traza de pila que ha especificado, es bastante claro que está utilizando el jdbc pool para obtener la conexión. JDBC pool tiene opciones para afinar varias configuraciones de grupos de conexiones y registrar detalles sobre lo que está sucediendo dentro del grupo.

Puede consultar la documentación detallada de apache en la configuración del grupo para especificar el tiempo de espera de abandono

Verifique los parámetros removeAbandoned, removeAbandonedTimeout, logAbandoned

Además, puede hacer uso de propiedades adicionales para ajustar aún más la validación

Utilice testXXX y validationQuery para la validez de la conexión.


Tuve el mismo problema, con esta configuración , también usé DataSource de Tomcat ( org.apache.tomcat.jdbc.pool ) para conectarme con 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.

Lo que lo resolvió para mí fue agregar esto al código de inicio de DataSource (tomando prestado de una pregunta de Grails ):

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

No estoy seguro de si estos tres son necesarios para obtener una conexión estable, tal vez no, pero tener todos habilitados probablemente no duela mucho.

Los JavaDocs aclaran lo que está pasando: ver, por ejemplo, setTestOnBorrow() . Un poco sorprendente, tal vez, que por defecto no se hacen tales pruebas.


Tuve exactamente el mismo problema, pero en mi caso las respuestas antes mencionadas no ayudaron. Me di cuenta de que al hacer una consulta larga aparece el mismo error. En mi caso, llamé a findAll (ID repetibles) y pasé una enorme lista de más de 100,000 ID. Particionar la lista (por ejemplo, usar ListUtils de Apache Commons o Google Guava) y llamar a findAll () con menos ID hizo el truco.