java.sql.SQLException: соединение org.postgresql.jdbc.PgConnection закрыто

Окружающая среда:

Java 8
WildFly 8 (WF 8)
PostgreSQL 11
Spring 4.3
Hibernate 5

DBCP версии 2.5
Драйвер PostgreSQL JDBC: 42.2.5

В этом Java-приложении мы запускаем задание через Quartz. Скажем, каждые N часов вызывается метод, этот метод порождает 30-40 потоков, которые начинают выполнять какую-то работу. Эта работа включает доступ к базе данных PostgreSQL.

Когда WildFly не перезагружается 4-5 дней подряд, и приложение, развернутое в WildFly, тоже не перезагружается... то через какое-то время мы начинаем получать эту ошибку.

Что может быть причиной? Похоже, что пул соединений дает приложению соединение, которое уже закрыто. Но у нас есть testOnBorrow=true в нашей конфигурации источника данных. Так как же это возможно?

Любые идеи, как мы можем избавиться от этой ошибки и сделать это наилучшим образом? Мне это кажется ошибкой либо в DBCP, либо в драйвере JDBC, но я далеко не уверен.

    27 May 2019 18:12:37 ERROR [taskExecutor-13] synchronizer.SynchronizerPostProcessUtil:162 - Batch Process Call Errored - DB is not updated
    org.springframework.orm.hibernate5.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [ select count(1) from kwt.Error_BatchUpdate(?,?,?) ]; SQL state [null]; error code [0]; could not prepare statement; nested exception is org.hibernate.exception.GenericJDBCException: could not prepare statement
        at org.springframework.orm.hibernate5.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:248)
        at org.springframework.orm.hibernate5.HibernateTemplate.doExecute(HibernateTemplate.java:368)
        at org.springframework.orm.hibernate5.HibernateTemplate.execute(HibernateTemplate.java:315)
        at com.company123.db.dao.common.HibernateDao.callStoredProcedureWithParameters(HibernateDao.java:947)
        at com.company123.db.dao.common.HibernateDao.callOpenXmlBatchProcessingWithParameters(HibernateDao.java:927)
        at com.company123.synchronizer.SynchronizerPostProcessUtil.executeBatchItems(SynchronizerPostProcessUtil.java:156)
        at com.company123.synchronizer.SynchronizerPostProcessUtil.processPostProcessItems(SynchronizerPostProcessUtil.java:76)
        at com.company123.synchronizer.AbstractSubAccountSynchronizer.createSubAccount(AbstractSubAccountSynchronizer.java:51)
        at com.company123.synchronizer.AbstractSubAccountSynchronizer.createSubAccount(AbstractSubAccountSynchronizer.java:23)
        at com.company123.synchronizer.SESynchronizer.syncSubAccount(SESynchronizer.java:990)
        at com.company123.synchronizer.SESynchronizer.syncLocalToSE(SESynchronizer.java:332)
        at com.company123.lifecycle.mb.LifeCycleRunnable.runMBLifeCycle(LifeCycleRunnable.java:188)
        at com.company123.lifecycle.mb.LifeCycleRunnable.run(LifeCycleRunnable.java:113)
        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: org.hibernate.exception.GenericJDBCException: could not prepare statement
        at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:181)
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:147)
        at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1985)
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1915)
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1893)
        at org.hibernate.loader.Loader.doQuery(Loader.java:938)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
        at org.hibernate.loader.Loader.doList(Loader.java:2692)
        at org.hibernate.loader.Loader.doList(Loader.java:2675)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507)
        at org.hibernate.loader.Loader.list(Loader.java:2502)
        at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:335)
        at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2200)
        at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1016)
        at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:152)
        at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414)
        at org.hibernate.query.internal.AbstractProducedQuery.uniqueResult(AbstractProducedQuery.java:1457)
        at com.company123.db.dao.common.HibernateDao$19.doInHibernate(HibernateDao.java:971)
        at org.springframework.orm.hibernate5.HibernateTemplate.doExecute(HibernateTemplate.java:361)
        ... 14 more
    Caused by: java.sql.SQLException: Connection org.postgresql.jdbc.PgConnection@25d46a62 is closed.
        at org.apache.commons.dbcp2.DelegatingConnection.checkOpen(DelegatingConnection.java:594)
        at org.apache.commons.dbcp2.DelegatingConnection.prepareStatement(DelegatingConnection.java:289)
        at org.apache.commons.dbcp2.DelegatingConnection.prepareStatement(DelegatingConnection.java:292)
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:145)
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:171)
        ... 32 more

person peter.petrov    schedule 29.05.2019    source источник
comment
Я предполагаю, что есть брандмауэр, который случайным образом разрывает соединения. Попробуйте установить tcp_keepalives_idle на сервере PostgreSQL на меньшее значение и посмотрите, поможет ли это.   -  person Laurenz Albe    schedule 29.05.2019
comment
Не могли бы вы опубликовать все свойства, связанные с пулом соединений. Если пул соединений удерживает недопустимое соединение, вам следует настроить поток исключения для проверки соединений, находящихся в пуле, пока они простаивают, и удалить их, когда они недействительны.   -  person user06062019    schedule 12.06.2019
comment
Вы можете проверить настройки здесь stackoverflow.com/questions/56111248/   -  person user06062019    schedule 12.06.2019