Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用?
点击关注,赶紧上车
前几天Spring Boot 2.5.0发布了,其中提到了关于Datasource初始化机制的调整,有读者私信想了解这方面做了什么调整。那么今天就要详细说说这个重新设计的配置内容,并结合实际情况说说我的理解和实践建议。
弃用内容
先来纠正一个误区。主要之前在版本更新介绍的时候,存在一些表述上的问题。导致部分读者认为这次的更新是Datasource本身初始化的调整,但其实并不是。这次重新设计的只是对Datasource脚本初始化机制的重新设计。
先来看看这次被弃用部分的内容(位于org.springframework.boot.autoconfigure.jdbc.DataSourceProperties
),如果你有用过这些配置内容,那么新配置就很容易理解了。
/*** Mode to apply when determining if DataSource initialization should be performed* using the available DDL and DML scripts.*/@Deprecatedprivate DataSourceInitializationMode initializationMode = DataSourceInitializationMode.EMBEDDED;/*** Platform to use in the DDL or DML scripts (such as schema-${platform}.sql or* data-${platform}.sql).*/@Deprecatedprivate String platform = "all";/*** Schema (DDL) script resource references.*/private List<String> schema;/*** Username of the database to execute DDL scripts (if different).*/@Deprecatedprivate String schemaUsername;/*** Password of the database to execute DDL scripts (if different).*/@Deprecatedprivate String schemaPassword;/*** Data (DML) script resource references.*/@Deprecatedprivate List<String> data;/*** Username of the database to execute DML scripts (if different).*/@Deprecatedprivate String dataUsername;/*** Password of the database to execute DML scripts (if different).*/@Deprecatedprivate String dataPassword;/*** Whether to stop if an error occurs while initializing the database.*/@Deprecatedprivate boolean continueOnError = false;/*** Statement separator in SQL initialization scripts.*/@Deprecatedprivate String separator = ";";/*** SQL scripts encoding.*/@Deprecatedprivate Charset sqlScriptEncoding;
对应到配置文件里的属性如下(这里仅列出部分,就不全部列出了,主要就是对应上面源码中的属性):
spring.datasource.schema=
spring.datasource.schema-username=
spring.datasource.schema-password=
...
这些配置主要用来指定数据源初始化之后要用什么用户、去执行哪些脚本、遇到错误是否继续等功能。
新的设计
Spring Boot 2.5.0开始,启用了全新的配置方式,我们可以从这个类org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties
里看到详情。
下面我们通过一个简单的例子来体验这个功能的作用。
创建一个Spring Boot的基础应用,并在pom.xml中引入和mysql的依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
在配置文件中增加数据源和初始化数据源的配置,具体如下:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# Spring Boot 2.5.0 init schema & data
# 执行初始化脚本的用户名称
spring.sql.init.username=root
# 执行初始化脚本的用户密码
spring.sql.init.password=
# 初始化的schema脚本位置
spring.sql.init.schema-locations=classpath*:schema-all.sql
根据上面配置的定义,接下来就在
resource
目录下,创建脚本文件schema-all.sql
,并写入一些初始化表结构的脚本
create table test.user_info
(id int unsigned auto_increment comment '用户id'primary key,open_id varchar(255) default '' null comment '微信小程序openid',nick_name varchar(255) default '' null comment '微信名',head_img varchar(255) default '' null comment '微信头像',sex varchar(255) default '' null comment '性别',phone varchar(255) default '' null comment '手机',province varchar(255) default '' null comment '注册地址:省',city varchar(255) default '' null comment '注册地址:城市',country varchar(255) default '' null comment '注册地址:县/区',status tinyint unsigned default 0 not null comment '是否标记删除 0:否 1:是',create_time datetime not null comment '创建时间',update_time datetime not null comment '更新时间'
)
comment '用户表';
完成上面步骤之后,启动应用。然后打开MySQL客户端,可以看到在
test
库下,多了一个user_info
表
通过上面的例子,不难想到这样的功能主要可以用来管理应用启动与数据库配置的自动执行,以减少应用部署过程中手工执行的内容,降低应用部署的执行步骤。
配置详解
除了上面用到的配置属性之外,还有一些其他的配置,下面详细讲解一下作用。
spring.sql.init.enabled
:是否启动初始化的开关,默认是true。如果不想执行初始化脚本,设置为false即可。通过-D的命令行参数会更容易控制。spring.sql.init.username
和spring.sql.init.password
:配置执行初始化脚本的用户名与密码。这个非常有必要,因为安全管理要求,通常给业务应用分配的用户对一些建表删表等命令没有权限。这样就可以与datasource中的用户分开管理。spring.sql.init.schema-locations
:配置与schema变更相关的sql脚本,可配置多个(默认用;
分割)spring.sql.init.data-locations
:用来配置与数据相关的sql脚本,可配置多个(默认用;
分割)spring.sql.init.encoding
:配置脚本文件的编码spring.sql.init.separator
:配置多个sql文件的分隔符,默认是;
spring.sql.init.continue-on-error:如果执行脚本过程中碰到错误是否继续,默认是
false`;所以,上面的例子第二次执行的时候会报错并启动失败,因为第一次执行的时候表已经存在。
应用建议
关于这些配置的应用,相信聪明的你一定会把它与数据库的版本管理联系起来(因为可以自动的执行脚本)。
那么依靠这些配置,是否可以胜任业务应用部署时候数据库初始化的自动化实现呢?
个人认为就上述所介绍的配置,虽然具备了一定的自动执行能力。但由于缺失对当前环境的判断能力,所以要应对实际的部署场景来说,还是远远不够的。
如果要自动化的管理数据库表结构、初始化数据的话,我的建议是:
默认提供的这个初始化功能可以且仅用于单元测试,自动创建数据库结构与初始化数据,使用完毕后销毁。可以方便的控制每次单元测试的执行环境一致。
应用在环境部署的时候,还是要使用之前介绍过的Flyway来实现,如何使用可见之前的分享:使用Flyway来管理数据库版本。
联合Flyway一同使用,通过
org.springframework.jdbc.datasource.init.DataSourceInitializer
来定义更复杂的执行逻辑。
更多本系列免费教程连载:
https://blog.didispace.com/spring-boot-learning-2x/
代码示例
本文的相关例子可以查看下面仓库中的chapter3-13
目录:
Github:https://github.com/dyc87112/SpringBoot-Learning/
Gitee:https://gitee.com/didispace/SpringBoot-Learning/
原创不易,如果您觉得本文不错,欢迎Star
支持,您的关注是我坚持的动力!
往期推荐
Spring Boot 中关于 %2e 的 Trick
一个多月的努力,FGC发生频率优化了400倍
重磅!Spring Boot 2.5.0火热发布,还学得动吗?
干货篇:深入剖析 MySQL 索引和 SQL 调优实战
常用正则表达式最强整理(速查手册)
如果你喜欢本文,欢迎转发并关注我,订阅更多精彩内容
关注我回复「加群」,加入Spring技术交流群
Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用?相关推荐
- Spring Boot Admin 2.0开箱体验
2019独角兽企业重金招聘Python工程师标准>>> 概述 在我之前的 <Spring Boot应用监控实战> 一文中,讲述了如何利用 Spring Boot Admi ...
- Spring Boot学习总结(12)——Spring Boot Admin 2.0应用监控示例
Spring Boot Admin 2.0新特性 Spring Boot Admin 2.0 变化还是挺多的,具体参考 官网说明,这里列几条主要的:使用Vue.js重写了UI界面,漂亮得不像实力派 : ...
- Spring Boot 2.3.0 新特性:优雅停机!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 前言:关于Spring Boot.Spring Cloud应用的优 ...
- Spring Boot 2.3.0 发布:支持Java14、打包Docker镜像、优雅关机配置...
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 冷冷gg 来源 | https://www.oschin ...
- 重磅!Spring Boot 2.5.0火热发布,还学得动吗?
今年520的事情是真的多,把Spring Boot 2.5.0的版本发布都给忽略了! 今天跟我一起看看Spring Boot 2.5.0又都带来了哪些振奋人心的新特性吧! 主要更新 支持 Java 1 ...
- 前瞻:Spring Boot 2.4.0 第二个里程碑版本发布
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://www.oschina.net ...
- Spring Boot 2.3.0 新特性:优雅停机
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 前言:关于Spring Boot.Spring Clou ...
- Spring Boot 2.1.0 已发布,7 个重大更新!
距离<重磅:Spring Boot 2.0 正式发布!>已经过去大半年了,而 Spring Boot 2.1.0 在 10 月底就发布了,我们来看下 Spring Boot 2.1.0 都 ...
- Spring Boot 2.1.0 已发布,7 个重大更新! 1
距离<重磅:Spring Boot 2.0 正式发布!>已经过去大半年了,而 Spring Boot 2.1.0 在 10 月底就发布了,我们来看下 Spring Boot 2.1.0 都 ...
最新文章
- 万能android调用webservice方法——参数类型不受限制
- phpinfo.php ctf,这你不是你所常见的PHP文件包含漏洞(利用phpinfo)
- 三种途径助物联网改变业务 省心省时省成本
- Windwos 08R2_DNS全面图文详解
- 对数学本质特征的若干认识
- java中的链接之其他窗体_两个窗体之间的链接
- 尾递归优化原理与Python实现(以Fibonacci数列和小明爬楼梯问题为例)
- 中国塑料汽车外饰件市场趋势报告、技术动态创新及市场预测
- 《Java程序员职场全功略:从小工到专家》连载四:IT人不容易
- 【leetcode】Wildcard Matching
- 手把手教你实现热更新功能,带你了解 Arthas 热更新背后的原理
- dis 密集光流_密集光流估计的自监督注意力机制
- 数控系统市场下行压力逐渐增大
- TCP交互式游戏《基于TCP的C/S程序设计》
- 机房收费系统——可行性分析报告
- 公众号开发定时群发php,微信公众平台新增定时群发功能(新功能)
- 战神引擎传奇手游源码【诛仙玛法单职业五大陆】
- 流媒体技术基础-流媒体文件格式
- 大气化学实验卫星 ACE-FTS(SCISAT) 相关介绍
- HL6601高性价比多种快充协议芯片QC3.0QC2.0华为FCP,SCP.VOOV苹果三星快充协议
热门文章
- Sysinternals Suite 2012.06.28软件简介
- C语言复习篇之数组与指针
- 用指针的观点来深入理解dup和dup2的用法
- golang 调用 c 动态库so 静态库a
- centos7 tomcat8 配置 java web环境 熵池不够大 启动慢问题
- linux shell 字符串查找
- docker 嵌套技术 docker outside of docker 可用于一个容器内调用另一个容器内程序 跨容器调用 docker容器内获取自身容器信息
- CentOS下tftp 安装配置使用
- firefox让标签栏显示在地址栏的下面的方法
- MFC ComboBox