SpringJava应用程序更改如何导致“验证连接失败”hikari池错误?

dauxcl2d  于 2021-07-15  发布在  Java
关注(0)|答案(0)|浏览(253)

本周,我的团队在部署一个看似无害的代码更改时遇到了一系列奇怪的错误,我正在寻找可能发生了什么的指针。我们无法在非生产环境中重现该问题,并且在了解该问题之前不愿意重新部署。
我们正在使用JavaSpringBoot、hibernate、postgres和hikari。代码更改是一个非功能性的重构,用于拆分一个大型服务类 FooService 分成两个班 FooReadService 以及 FooUpsertService . 所有这三个都在类级别标记为 @Transactional .
下面是部署这些更改后我们立即观察到的日志系列。如您所见,第一个错误与验证hikari数据库连接失败有关。随后的错误是无法建立数据库连接,然后在只读事务中执行写操作。
有趣的是,在只读事务中执行写操作的错误发生在几个与此特定更改完全无关的代码路径中。在这起事件中,雷兹似乎成功地工作了。这是我们第一次看到这样的错误后,大约一年的生产运行。

理论

与用一个简单的词来划分一个类有关的东西 @Transactional 注解为两个类会导致数据库连接问题。也许事务边界没有被重用?我们没有更改的默认传播行为 REQUIRED 不过。
在我们的部署管道中发生了一些与此pr完全无关的事情,导致此特定部署出现问题。
只有在请求量很大的情况下才会表现出来的东西(请求量在此部署窗口期间是典型的,但这可能解释了本地行为与生产行为之间的差异。)

问题

hikari出现“验证连接失败”错误的可能根本原因是什么?
所有其他的错误仅仅是这个错误的下游后果吗?“无法执行选择更新”错误是如何由“验证连接失败”错误引起的?
什么样的java应用程序逻辑更改可能导致这些错误?
单元测试、集成测试、本地开发测试成功而生产失败的原因是什么(不同的环境配置,不同的流量……)
我们能做些什么来证明或反驳上述理论?
我的下一步是在应用此更改的情况下模拟到本地示例的更多通信量,并查看这是否会导致问题出现。但如果有人指点我会很感激的。

事件期间的日志

2021-03-24 15:30:38-验证连接失败 com.zaxxer.hikari.pool.PoolBase: HikariPool-1 - Failed to validate connection org.postgresql.jdbc.PgConnection@3e1fe46b (This connection has been closed.). Possibly consider using a shorter maxLifetime value. 2021-03-24 15:30:53-无法获取jdbc连接 org.springframework.dao.DataAccessResourceFailureException: Unable to acquire JDBC Connection; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection 2021-03-24 15:30:55-无法为事务打开jpa entitymanager org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection 2021-03-24 10:35:54-无法在只读事务中执行select for update
o.h.engine.jdbc.spi.SqlExceptionHelper: ERROR: cannot execute SELECT FOR UPDATE in a read-only transaction org.springframework.orm.jpa.JpaSystemException: could not extract ResultSet; nested exception is org.hibernate.exception.GenericJDBCException: could not extract ResultSet

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题