每当检查连接时,schema.sql 就会运行

Posted

技术标签:

【中文标题】每当检查连接时,schema.sql 就会运行【英文标题】:schema.sql runs whenever the connection is checked 【发布时间】:2020-08-29 04:37:28 【问题描述】:

我遇到了一个奇怪的问题。 我的 springboot 应用程序中有一个 schema.sql 文件,它创建表(带有外键约束)并在应用程序运行时插入数据。但这里的问题是,当连接空闲时,连接被测试。现在,这给我带来了问题,因为schema.sql 文件再次执行,并且您知道我的表包含外键约束,因此脚本失败,因为它不允许删除包含外键约束的表。

是因为我的application.properties吗?

这是我的 application.properties

spring.datasource.url=jdbc:mysql://dummy_url
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.initialization-mode=always
mybatis.config-location=classpath:/config/mybatis-config.xml

有没有办法让 schema.sql 只执行一次(仅在应用程序运行时)? 我的示例schema.sql 看起来像这样:

DROP TABLE IF EXISTS `t001_map_mst`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `t001_map_mst` (
  `MAP_ID` int NOT NULL AUTO_INCREMENT,
  `MAP_NAME` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`MAP_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='Contains map info';
/*!40101 SET character_set_client = @saved_cs_client */;

【问题讨论】:

【参考方案1】:

因为您使用的是spring.datasource.initialization-mode=always,所以此属性具有以下值:

始终初始化数据源。 EMBEDDED 仅初始化嵌入式数据源。 NEVER 不要初始化数据源。 检查official document

我提供了三种解决问题的方法 1.改变你的schema.sql,如果表存在则不要运行脚本 2. 完成第一次运行后更改您的 application.properties,将其更改为 spring.datasource.initialization-mode=none 3.从代码初始化:检查Spring Boot - Loading Initial Data

【讨论】:

我觉得改变我的架构是最好的办法。 但是当你想改变你的表架构时会很复杂。 你有什么建议? 使用两组配置文件或只更改属性更容易 我认为从代码中更改属性是不可能的。还是有可能?

以上是关于每当检查连接时,schema.sql 就会运行的主要内容,如果未能解决你的问题,请参考以下文章

AtomikosSQLException:连接池已耗尽 - 每当应用程序抛出异常时,连接就会耗尽

为啥 Spring Boot 2.0 应用程序不运行 schema.sql?

检查命令是不是在 bashrc 中运行

每当我单击按钮时,我的应用程序就会崩溃

c++ 运行时检查失败 #2 - 变量“ToSend22”周围的堆栈已损坏

UIAlertView 在启动时导致警告消息