在 docker 容器中几分钟后 Spring Boot 连接重置

Posted

技术标签:

【中文标题】在 docker 容器中几分钟后 Spring Boot 连接重置【英文标题】:Spring boot connection reset after a few minutes in docker container 【发布时间】:2017-06-18 10:45:52 【问题描述】:

后端在 docker 容器中运行。它与弹簧启动和安全一起运行并且工作正常。前端也在另一个容器中运行。一切正常,直到突然抛出这个异常。我只是在空闲几分钟(通常在 5 到 10 分钟之间)后才注意到这个异常。

警告 1 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper:SQL 错误:0,SQLState:08S01 错误 1 ​​--- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper:I/O 错误:连接重置 错误 1 ​​--- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]:Servlet.service() 用于路径 [] 上下文中的 servlet [dispatcherServlet] 引发异常 [请求处理失败;嵌套异常是 org.springframework.dao.DataAccessResourceFailureException: could not extract ResultSet;嵌套异常是 org.hibernate.exception.JDBCConnectionException: could not extract ResultSet] 根本原因 java.net.SocketException:连接重置 在 java.net.SocketInputStream.read(SocketInputStream.java:209) ~[na:1.8.0_111-internal] 在 java.net.SocketInputStream.read(SocketInputStream.java:141) ~[na:1.8.0_111-internal] 在 java.io.DataInputStream.readFully(DataInputStream.java:195) ~[na:1.8.0_111-internal] .....

与数据库的连接始终可用。奇怪的是,只有当我使用 docker 运行我的项目时才会抛出这个错误。如果我使用 eclipse & node.js 运行它,则不会发生错误。我唯一注意到的是,在我登录并闲置几分钟后,当我尝试做某事时,我自动退出了。我不知道这是否与原始错误有任何关系。

application.properties

spring.datasource.url=databaseURL
spring.datasource.username=SQLusername
spring.datasource.password=Password
spring.datasource.driver-class-name=net.sourceforge.jtds.jdbc.Driver
spring.datasource.initialSize=100
spring.datasource.minIdle=10

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

spring.datasource.tomcat.max-active=250
spring.datasource.tomcat.max-wait=30000
spring.datasource.test-on-borrow=true
spring.datasource.test-while-idle=true
spring.datasource.minEvictableIdleTimeMillis=21600000
spring.datasource.timeBetweenEvictionRunsMillis=43200000


spring.datasource.connection-test-query=SELECT 1
spring.datasource.validationQuery=SELECT 1

我很高兴每一个可以帮助解决这个问题的建议。

【问题讨论】:

您在处理哪个数据库引擎?您是否从数据库引擎本身收到任何错误? 【参考方案1】:

几个月前我也遇到过同样的问题! 发生这种情况是因为 jvm 没有足够的内存来接受这个请求!

此错误是间歇性的,很难找到您的根本原因!

试试这个: 在你的 Dockerfile 中加入一些标志来解决它

ENTRYPOINT ["java","-XX:+TieredCompilation","-XX:TieredStopAtLevel=1", "-jar","yourJar.jar"]

更多详情:https://jpbempel.github.io/2020/05/22/startup-containers-tieredcompilation.html

有时问题可能出在内存上。当你用java启动你的容器时,jvm默认堆内存是容器总内存的1/4。 然后您可以使用标志 -XX:MaxRAMFraction,其中您的值的范围是 1 到 4。

更多详情:https://merikan.com/2019/04/jvm-in-a-container/#java-8u131-and-java-9

祝你好运!

【讨论】:

以上是关于在 docker 容器中几分钟后 Spring Boot 连接重置的主要内容,如果未能解决你的问题,请参考以下文章

从 Google Cloud Run 服务中的 docker 容器到 Google Cloud SQL 的请求最多需要 2 分钟

关于Spring Bean的生命周期中几个常用方法(@PostConstruct@PreDestroy 等)的执行顺序

Spring容器启动流程

Spring中几个最常见的注解

Liveness 探测 - 每天5分钟玩转 Docker 容器技术(143)

Spring Boot + MySQL docker 容器