Java Docker MySQL在超时后删除表:连接关闭后不允许任何操作
非常奇怪的情况。我正在使用SpringBoot,SpringDataJPA和MySQL在docker容器中运行。启动应用程序后,一切正常(DB在启动时使用Java Docker MySQL在超时后删除表:连接关闭后不允许任何操作,java,mysql,spring-boot,docker,spring-data-jpa,Java,Mysql,Spring Boot,Docker,Spring Data Jpa,非常奇怪的情况。我正在使用SpringBoot,SpringDataJPA和MySQL在docker容器中运行。启动应用程序后,一切正常(DB在启动时使用spring.jpa.hibernate.ddl auto=create drop初始化) 如果我在运行另一个请求时,在大约10分钟后让应用程序继续运行,我会返回表不存在的状态。检查数据库,我可以看到所有的表都消失了(模式仍然存在) 日志在发生错误之前向我显示此警告: 2020-12-20 16:15:41.151 WARN 11018 --
spring.jpa.hibernate.ddl auto=create drop
初始化)
如果我在运行另一个请求时,在大约10分钟后让应用程序继续运行,我会返回表不存在的状态。检查数据库,我可以看到所有的表都消失了(模式仍然存在)
日志在发生错误之前向我显示此警告:
2020-12-20 16:15:41.151 WARN 11018 --- [nio-8080-exec-4] com.zaxxer.hikari.pool.PoolBase : myDS - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@67dd33b2 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.
2020-12-20 16:15:41.153 WARN 11018 --- [nio-8080-exec-4] com.zaxxer.hikari.pool.PoolBase : myDS - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@3817c06d (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.
2020-12-20 16:15:41.155 WARN 11018 --- [nio-8080-exec-4] com.zaxxer.hikari.pool.PoolBase : myDS - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@536cd1b2 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.
然后:
2020-12-20 16:15:41.161 WARN 11018 --- [nio-8080-exec-4] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1146, SQLState: 42S02
2020-12-20 16:15:41.161 ERROR 11018 --- [nio-8080-exec-4] o.h.engine.jdbc.spi.SqlExceptionHelper : Table 'tasker.account' doesn't exist
2020-12-20 16:15:41.173 INFO 11018 --- [nio-8080-exec-4] o.h.e.internal.DefaultLoadEventListener : HHH000327: Error performing load command
我还在application.properties中添加了此设置:
spring.datasource.hikari.max life=600000
以匹配mysql的设置
Docker从以下内容开始:
docker run--name=mysql1--d故障时重新启动mysql/mysql服务器:8.0
注意:mysql的本地实例(本机,不在docker中)永远不会发生这种情况。
任何帮助都将不胜感激。请看以下答案:
当您使用create drop
时,您可能对他的答案的以下部分感兴趣:
通常在测试用例场景中,您可能会使用createdrop
so
创建模式后,测试用例会添加一些模拟数据,然后
运行测试,然后在测试用例清理过程中,运行模式
对象被删除,留下一个空数据库
create drop
将在关闭SessionFactory时删除架构,现在让我们来处理SessionFactory关闭的部分,它可能与网络连接超时有关,这导致SessionFactory通过springboot自动关闭
您可以在application.properties中添加心跳信号以防止发生这种行为,无论以何种方式,此部件都解决了my production env中的许多问题,因此添加以下内容非常有帮助:
#HeartBeat the database so that connections don't die otherwise the connections die silently
#and when a query commes along the JPA will throw an error and keep throwing errors and a restart of the process
#is inevitable
spring.datasource.testWhileIdle=true
spring.datasource.test-on-borrow=true
spring.datasource.validationQuery=SELECT 1
我将在这里链接到一个答案,该答案涉及在>4之后检查连接和池健康连接到Db的问题似乎出现在该设置中:
spring.datasource.hikari.max life
在application.properties中添加此设置似乎已经解决了问题:spring.datasource.hikari.max life=100000
而与mySQL值完全匹配的spring.datasource.hikari.max life=600000
不起作用-即导致表被删除。谢谢,但这并不能回答为什么应用程序仍在运行,数据库在超时10分钟后被删除的问题。我使用create drop
在本地开发模式下运行应用程序,它不是任何自动测试的一部分。我启动应用程序,它超时,数据消失,但应用程序继续运行值create drop
传递给Hibernate,在Hibernate中的理解如下:“数据库架构将被删除并随后创建。关闭SessionFactory后,数据库架构将被删除。”--我想说你们的会议工厂过一会儿就关门了。你能在那里设置一个断点,看看是否会发生这种情况吗?这是另一页,试图解释spring.jpa.hibernate.ddl auto=create drop
的用法,显示表在SessionFactory#close()处被删除
:您也可以检查此项:请注意,保留旧的超时值,仅将create drop
更改为create
并不能解决问题。同样的情况也会发生-表被删除添加此设置似乎已经解决了问题:spring.datasource.hikari.max life=100000
而与mySQL值完全匹配的spring.datasource.hikari.max life=600000
不起作用。因此,这是这个问题和create-drop的结合。您的连接类型是什么?@Perimosh连接类型?不确定您的确切意思,但它是JDBCURL:spring.datasource.url=jdbc:mysql://172.17.0.2:3306/tasker?useUnicode=yes&characterEncoding=UTF-8
它是嵌入式的吗?如果是,是hsqldb、h2还是derby?@Perimosh它是在docker上运行的mysql
,如问题中所述。它不是hsqldb、h2或derby。