数据初始化
[一]知识铺垫
自动数据初始化,需要了解一定的
Spring Data JPA
知识,如果对此还不了解,请先阅读 Spring Data JPA 数据初始化机制
[二]操作步骤
Dante Cloud 数据库表创建和默认数据的初始化,就是使用 Spring Data JPA
自身的机制实现。
在 Dante Cloud 数据库表创建和默认数据的初始化过程中, 主要会进行以下几项操作。
- 创建核心业务表
- 扫描已运行服务中所有的
RestController
接口,将接口数据转换为权限数据,并汇总至用户中心服务统一存储和管理。 - 系统默认数据,如用户,角色等数据的初始化。
注意
具体开始之前,一定要确保所有前序工作已经完成。参阅:数据库初始化前序工作
步骤一:创建数据表
1. 进入 Nacos 管理界面。找到您所使用的对应 多环境
下的 dante-cloud-environment.yaml
配置文件
例如,您当前使用的是 development
环境,那么在 Nacos 后台管理中,找到 Group
是 development
的 dante-cloud-environment.yaml
配置。多环境配置,参阅:多环境配置
2. 设置 dante-cloud-environment.yaml
配置文件中属性 herodotus.switch.database.ddl-auto
的值为 create
或 update
注意
- 如果是初次部署,或者想将已有表重新创建,那么将
herodotus.switch.database.ddl-auto
的值设置为create
。 - 如果是已经开始使用系统了,想保留已有的数据,只做更新,那么将
herodotus.switch.database.ddl-auto
的值设置为update
。
3. 点击发布
按钮,发布配置,让配置生效
警告
正式环境一定要提前做好数据备份。
如果是
MySQL
数据库的初次部署,那么最好将herodotus.switch.database.ddl-auto
的值设置为update
,否则就会出错。herodotus.switch.database.ddl-auto
的值设置为update
, 再次运行服务,由于Hibernate
不同方言实现逻辑的不同,在有些数据库下运行,例如:PostgreSQL
, 对于某些兼容性问题,只是输出告警;在某些数据库下运行,例如 MySQL,对于某些兼容性问题,会直接抛出 Exception。所以出现这种情况,只要服务继续在运行就不是系统 BUG;如果出错直接导致服务运行停止,那么请报ISSUE
。参阅:MySQL 常见问题
4. 运行 UpmsApplication
服务
UpmsApplication
服务第一次正常运行之后,所有核心业务表都已经创建,UpmsApplication
服务中所有接口都已经转换为权限数据存入sys_attribute
表中。
如果看到有数据库表创建,同时
sys_authority
表中有数据,证明数据库表创建成功。
5. 运行 UaaApplication
服务
UaaApplication
服务第一次正常运行之后,所有 OAuth2 认证相关表都已经创建。UaaApplication
服务中所有接口都已经转换为权限数据存入sys_attribute
表中。
如果看到有以
oauth2_
开头的数据表创建,证明数据库表创建成功。
6. 运行 MessageApplication
服务
MessageApplication
服务第一次正常运行之后,所有站内消息等相关表都已经创建。MessageApplication
服务中所有接口都已经转换为权限数据存入sys_attribute
表中。
如果看到有以
msg_
开头的数据表创建,证明数据库表创建成功。
7. 运行 OssAbilityApplication
服务
OssAbilityApplication
服务第一次正常运行之后,OssAbilityApplication
服务中所有接口都已经转换为权限数据存入sys_attribute
表中。
为什么表结构的创建不提供脚本?
主要出于以下考虑:
- 一方面系统默认使用 Spring Data JPA 已经支持了自动建表,数据表的创建和更新都很方便,仅有的问题对于 MySQL 方言支持的一般,会有错误提示,但是不影响整体初始化逻辑。
- 另一方面微服务架构相比单体应用来说庞大得多,需要关注的内容也扩展了很多倍。提供数据库表结构的脚本,就意味随时要去关注这个 SQL 脚本的更新问题,一旦有遗漏就很容出错,会浪费很多时间和精力,得不偿失。
步骤二:初始默认数据
说明
系统提供自动初始化和手动初始化数据库两种方式。
自动化初始化数据库的机制完全由 Spring Data JPA 提供,使用习惯之后非常便捷。但是项目开源至今,发现很多人还是喜欢手动导数据,也提供了数据库初始化脚本。也正因为如此,也修改了本部分说明,主要说明手动导入数据,自动导入数据仅做说明供对此感兴趣的朋友参考。
注意
要按照前面步骤,保证 UpmsApplication
、UaaApplication
、MessageApplication
、OssAbilityApplication
几个服务均已经正常运行过、服务中所有接口都已经转换为权限数据存入sys_attribute
表中以后,在执行数据库初始化脚本。
因为,数据库初始化脚本中,最后一条 SQL 语句,是根据 sys_attribute
表中存储的数据,动态生成权限数据。如果过早执行数据库初始化脚本,会导致权限数据创建不完整,前端出现“没有权限”提示问题。
方式一:手动初始化
设置
dante-cloud-environment.yaml
配置文件中属性herodotus.switch.database.ddl-auto
的值为update
或none
。在工程
${project_home}/platform/dante-cloud-oss-ability/resources/sqls
目录下,可以找到对应数据库数据初始化脚本。可以用你喜欢的方式导入数据库。
方式二:自动初始化
停止
OssAbilityApplication
服务进入 Nacos 管理界面。找到您所使用的对应
多环境
下的dante-cloud-environment.yaml
配置文件。设置
dante-cloud-environment.yaml
配置文件中属性herodotus.switch.database.ddl-auto
的值为update
或none
设置
dante-cloud-environment.yaml
配置文件中属性herodotus.switch.database.init-mode
的值为always
点击
发布
按钮,发布配置,让配置生效。如果默认使用的不是
PostgreSQL
数据库,需要修改${project_home}/platform/dante-cloud-oss-ability/resources/bootstrap.yml
中spring.sql.init.data-locations
配置,放开您所使用数据库对应的 SQL 脚本。注释掉其它 SQL 脚本再次运行
OssAbilityApplication
服务。
OssAbilityApplication
服务再一次正常运行之后,如果sys_user
,sys_role
,sys_role_permission
等表中都都已经有数据了,证明数据初始化成功。
步骤三:回置配置
停止
OssAbilityApplication
服务进入 Nacos 管理界面。找到您所使用的对应
多环境
下的dante-cloud-environment.yaml
配置文件。设置
dante-cloud-environment.yaml
配置文件中属性herodotus.switch.database.init-mode
的值重置为never
。检查
dante-cloud-environment.yaml
配置文件中属性herodotus.switch.database.ddl-auto
的值为update
或none
点击
发布
按钮,发布配置,让配置生效。
为什么回置并再次检查?
- 如果
herodotus.switch.database.ddl-auto
的值为create
或create-drop
,再次启动服务会重新建表,那么前面的工作就白做了。 - 如果
herodotus.switch.database.init-mode
的值为always
,再次启动服务会再次执行 SQL 脚本,必定出现主键冲突问题导致失败。
[三]重置缓存
警告
所以为了规避因缓存原因而产生让人莫名奇妙的问题,在以上步骤均完成之后(数据库初始化完成之后),一定要按照以下步骤进行缓存重置
- 停止所有服务
- 清空 Redis 缓存数据
- 再次运行所有服务
总结
经过实际的使用,总体感受 Spring Data JPA
以及 Hibernate
的多数据库支持还是非常强大,在 PostgreSQL
等自身版本差异不大的数据库家族中,使用非常顺滑。而像MySQL
这种自身各个版本差异较大的数据库家族中,使用起来确实有点蹩脚。
配置参数对应关系
Dante Cloud 数据库操作设计配置参数与spring-boot-starter-data-jpa
配置参数对应关系如下表:
配置 | 对应 |
---|---|
herodotus.database-information.driver-class-name | spring.datasource.driver-class-name |
herodotus.database-information.url | spring.datasource.url |
herodotus.environment.database.username | spring.datasource.username |
herodotus.environment.database.password | spring.datasource.password |
herodotus.database-information.platform | spring.jpa.database spring.sql.init.platform |
herodotus.environment.database.dialect | spring.jpa.properties.hibernate.dialect |
herodotus.switch.database.ddl-auto | spring.jpa.hibernate.ddl-auto |
herodotus.switch.database.init-mode | spring.sql.init.mode |