Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Docker MySQL在超时后删除表:连接关闭后不允许任何操作_Java_Mysql_Spring Boot_Docker_Spring Data Jpa - Fatal编程技术网

Java Docker MySQL在超时后删除表:连接关闭后不允许任何操作

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 --

非常奇怪的情况。我正在使用SpringBoot,SpringDataJPA和MySQL在docker容器中运行。启动应用程序后,一切正常(DB在启动时使用
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。