更换数据库
[一]基本原理
Dante Cloud 核心数据访问层使用 Spring Boot 生态中的spring-boot-starter-data-jpa
组件,spring-boot-starter-data-jpa
核心依赖是 Spring Data JPA
。Spring Data JPA
利用 Hibernate
多数据库支持能力实现不同类型数据库的支持。
通过修改spring-boot-starter-data-jpa
对应的配置参数就可以达成更换数据库的目的。主要涉及需要修改的配置参数如下表所示:
配置 | 说明 |
---|---|
spring.datasource.driver-class-name | 数据库 Driver Class,不同的数据库驱动不同 |
spring.datasource.url | 数据库访问连接,不同数据连接格式也不同 |
spring.datasource.username | 数据库访问用户名,如果相同可以不用修改 |
spring.datasource.password | 数据库访问密码,如果相同可以不用修改 |
spring.jpa.database | 选择数据库类型,具体类型与枚举org.springframework.orm.jpa.vendor.Database 中的值对应,使用小写值即可 |
spring.jpa.properties.hibernate.dialect | 选择数据库类型对应的 dialect,在 org.hibernate.dialect 包下可以找到具体数据库对应的 dialect |
通过上表中的参数可以看出,更换数据库并不复杂,修改以上参数的值就可以达到更换数据库的目的。
[二]Dante Cloud 的设计
虽然更换数据库涉及的参数并不是非常多,但是对于使用者来说都是非常“模式”化的配置,而且,大多数用户所使用的数据库也相对固定。因此,Dante Cloud 在设计上,又对更换数据库进行了进一步的简化,设计思路如下:
[1]利用 Nacos 简化配置
在配置数据库连接时,除了 url
、username
、password
三个参数以及数据库类型不同以外,配置的内容和形式可以说是完全一致的。所以利用 Nacos 配置文件,将数据库配置通用内容进行固化,利用外部参数传递差异性内容最终实现更换数据库的简化。
在 Dante Cloud 提供的 Nacos 配置文件中,下面的几个配置文件就是用来简化更换数据库配置:
herodotus-cloud-database-mysql8.yaml
herodotus-cloud-database-mysql5.7.yaml
herodotus-cloud-database-postgresql.yaml
每个配置文件的内容也比较简单,以 PostgreSQL 配置为例,可以看出并不复杂:
- 能够确定具体值的参数就写死在配置文件中
- 不能够确定具体值的参数,就从外部传递进来
herodotus:
database-information:
platform: postgresql
driver-class-name: org.postgresql.Driver
dialect: org.hibernate.dialect.PostgreSQLDialect
url: jdbc:postgresql://${herodotus.environment.database.host}:${herodotus.environment.database.port}/${herodotus.environment.database.name}
[2]传递参数
仅有配置文件还不足以达到更换数据库的目的,还要能够保证参数可以准确的传递才行。在 Dante Cloud 更换数据库的设计中,传递参数采用了两种方式。
1. 配置文件占位符传递
在配置文件中,可以通过 ${}
获取到已经配置的参数值,通过这种方式就可以拿到最先加载的配置中的值。
Dante Cloud 将数据库涉及的 url
、username
、password
差异化参数,统一放置在 herodotus-cloud-environment.yaml
配置文件中,只要确保这个配置文件,在数据库配置文件之前加载,就可以正确的实现参数的传递。
herodotus:
environment:
......
database:
host: 127.0.0.1
port: 5432
name: herodotus
username: XXXXX
password: XXXXX
2. 多环境配置参数传递
前面参数传递的方式,解决了数据库配置参数的传递问题。还有一项需要解决的问题,就是如何来确定数据库类型。这里 Dante Cloud 沿用了 多环境配置设计中传递参数的方式,来解决确定数据库类型的问题。
- 在工程根目录的
pom.xml
进行数据库类型的设置,设置内容如下:
<!-- 开发 -->
<profile>
<id>development</id>
<activation>
<!--默认激活配置-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!--当前环境-->
<profile>development</profile>
<database>postgresql</database>
......
</properties>
</profile>
- 将数据库类型参数,以
@@
方式传递到 Spring Boot 配置文件中 - 最后利用这个参数找到 Nacos 中对应的数据库配置文件。
spring:
config:
activate:
on-profile: alibaba
cloud:
nacos:
config:
......
- data-id: herodotus-cloud-database-${DATABASE:@database@}.yaml
group: common
......
警告
需要注意的是,<database>postgresql</database>
的值一定要与 herodotus-cloud-database-postgresql.yaml
中的值匹配,包括值的大小写,否则将会找不到配置文件。
[三]更换数据库方法
- 在工程根目录的
pom.xml
中,找到当前多环境的配置节点。修改<database></database>
的值,当前默认支持的值有postgresql
、mysql57
、mysql8
和opengauss5
。 - 打开 Nacos 控制台,找到当前多环境 Group 中的
herodotus-cloud-environment.yaml
配置文件,修改host
、port
、name
、username
、password
几个参数值的与自己使用的数据库对应。 - 重新编译工程代码,让
pom.xml
中的配置生效。
[四]新增数据库配置
目前,Dante Cloud 默认提供postgresql
和mysql8
、mysql57
、opengauss5
四种种方言配置。在 Nacos 的配置中可以找到herodotus-cloud-database-postgresql.yaml
、herodotus-cloud-database-mysql8.yaml
,herodotus-cloud-database-mysql57.yaml
和herodotus-cloud-database-opengauss5.yaml
与之对应。
如果你所使用的数据库,postgresql
和mysql8
,mysql57
,opengauss5
四种方言配置并不能满足,那么请按照下面几步操作;如果能满足请跳过。
[1]新增Nacos配置文件
- 在 Nacos 中新建一个按照格式
herodotus-cloud-database-<database.type>.yaml
命名的配置。 - 复制下面的配置内容到该配置中
herodotus:
database-information:
platform: postgresql
driver-class-name: org.postgresql.Driver
dialect: org.hibernate.dialect.PostgreSQL10Dialect
url: jdbc:postgresql://${herodotus.environment.database.host}:${herodotus.environment.database.port}/${herodotus.environment.database.name}
- 根据自己使用的数据库,修改配置中对应的的信息。注意不要改变格式以及具体配置名,仅修改对应的值即可。
说明
herodotus-cloud-database-<database.type>.yaml 中,主要包含针对不同类型数据库,所使用的 JDBC Driver 等相关配置信息。
- platform:指定数据库类型。
注意:platform 具体值来源于枚举类
org.springframework.orm.jpa.vendor.Database
,请使用全部小写字母值进行配置。这个值不分版本,所以 mysql5 数据库和 mysql8 数据库均是使用mysql
,目前支持的值如下:db2
,derby
,h2
,hana
,hsql
,informix
,mysql
,oracle
,postgresql
,sql_server
,sybase
- driver-class-name:数据库驱动类名。
- dialect: 指定 Hibernate 针对不同的数据库的 Dialect,org.hibernate.dialect 包下可以找到具体数据库对应的 dialect。
- url:数据库连接 URL。
注意:这里的的 URL 是通过配置
herodotus-cloud-environment.yaml
,中的 herodotus.environment.database.host,port,name 等三个值组装而成。如果新增方言配置,不管具体数据库 URL 内容是什么,一定确保数据库地址,端口,数据库名使用${herodotus.environment.database.host},${herodotus.environment.database.port},${herodotus.environment.database.name}三个站位符替换,否则*-environment.yaml 中配置的值将不再生效。
[2]修改环境参数
在根据你所使用的多环境,找到 Nacos
对应 Group
下的herodotus-cloud-environment.yaml
配置,修改数据库相关的host
,port
,name
,username
,password
等几个参数的值。
herodotus:
environment:
......
database:
host: 127.0.0.1
port: 5432
name: herodotus
username: XXXXX
password: XXXXX
[3]修改 pom.xml
找到工程根目录下的pom.xml
, 根据你所使用的多换找到对应的<profiles>
, 修改<database.type>
属性值。
<database.type>postgresql</database.type>
[4]添加数据库 JDBC Driver
目前,系统代码已经包含 PostgreSQL
, MySQL
(支持 MySQL5
和 MySQL8
)、 H2
、Opengauss5
四种种数据库的JDBC Driver
, 如果你使用数据库不在此范围内,那么就需要在代码包date-core
的pom.xml
中添加对应数据库的JDBC Driver
。
[5]编译工程代码
以上步骤完成之后,使用mvn package
或mvn install
命令,重新编译工程。
说明
目前仅提供 PostgreSQL
和 MySQL
两种数据库对应的数据初始化脚本,其它数据库需要自己额外处理。