SpringBoot 2.5.3升级后spring.sql.init.schema-locations配置失效如何解决
SpringBoot 2.5+ spring.sql.init.schema-locations 配置失效解决方案
SpringBoot 2.5版本开始,原spring.datasource.schema、spring.datasource.data等数据库初始化配置正式迁移到spring.sql.init命名空间下,你遇到的配置失效可按以下优先级排查解决:
1. 补充初始化执行模式配置
spring.sql.init.mode默认值为embedded,仅对未引入第三方连接池的纯嵌入式数据库(如H2)自动执行初始化。你项目中使用了Druid连接池,会被识别为非嵌入式数据库场景,需要手动指定执行模式:
spring: sql: init: mode: always # 新增该配置,强制执行初始化脚本 schema-locations: classpath:sql/create_table_h2.sql
参数说明:always表示始终执行初始化,embedded仅嵌入式数据库执行,never禁用初始化
2. 解决全局懒加载冲突
你当前配置开启了spring.main.lazy-initialization=true全局懒加载,会导致SQL初始化相关的Bean被延迟实例化,无法在项目启动阶段执行SQL脚本,可增加配置类手动排除SQL初始化Bean的懒加载:
import org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @Configuration @ConditionalOnProperty(prefix = "spring.sql.init", name = "mode", havingValue = "always") @Import(SqlInitializationAutoConfiguration.class) public class SqlInitConfig { }
3. 特殊场景排查(Druid连接池适配)
如果以上配置完成后依然不生效,可以临时将spring.datasource.druid.async-init改为false关闭异步初始化,避免连接池初始化晚于SQL脚本执行导致的执行失败。
多SQL脚本配置示例
如果需要执行多个初始化脚本,schema-locations支持数组格式配置:
spring: sql: init: mode: always schema-locations: - classpath:sql/create_table_h2.sql - classpath:sql/init_base_data.sql
内容的提问来源于stack exchange,提问作者oliver
相关产品推荐
相关产品推荐

