随着项目的发展,一个项目中的代码量会很是庞大,同时数据库表也会错综复杂。若是一个项目使用了Liquibase对数据库结构进行管理,愈来愈多的问题会浮现出来。java
<sql>
时,禁止包含schema名称其它数据库规范再也不赘述。算法
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <changeSet id="T100-20181009-001" author="markfredchen" > <createTable tableName="demo_user" remarks="用户表"> <column name="id" type="bigint" remarks="用户ID,主键"> <constraints nullable="false" primaryKey="true" primaryKeyName="pk_demo_user_id"/> </column> <column name="username" type="varchar(100)" remarks="用户名"> <constraints nullable="false"/> </column> ... </createTable> </changeSet> </databaseChangeLog>
使用Liquibase中提供<include file="xxx"/>
tag,能够将ChangeSet分布在不一样文件中。同时<include/>
支持多级引用。
基于此功能能够对项目中的ChangeSet进行有效管理。推荐使用如下规范进行管理。spring
resources |-liquibase |-user | |- master.xml | |- release.1.0.0 | | |- release.xml | | |- user.xml -- 用户相关表ChangeSet | | |- user.csv -- 用户初始化数据 | | |- company.xml -- 公司相关表ChangeSet | |- release.1.1.0 | | |- release.xml | | |- ...
当项目变得庞大以后,一个服务可能包含的功能模块会愈来愈多。此时你们会想尽办法进行模块拆分,逐步进行微服务化。然而在面对错综复杂的Liquibase ChangeSet就会无从下手。
针对这种未来可能会面对的问题,项目初期就对Liquibase进行模块化管理,将在将来带来很大收益。
首先说明一下Spring Boot中Liquibase默认是如何执行以及执行结果。sql
databasechangelog
和databasechangeloglock
所以咱们能够认为一个SpringLiquibase执行为一个模块。数据库
引入多模块管理时,基于上节文件管理规范,咱们基于模块管理再作下调整。数据结构
resources |-liquibase |-user | |- master.xml | |- release.1.0.0 | | |- release.xml | | |- user.xml -- 用户相关表ChangeSet | | |- user.csv -- 用户初始化数据 | | |- company.xml -- 公司相关表ChangeSet | |- release.1.1.0 | | |- release.xml | | |- ... |- order | |- master.xml | |- release.1.0.0 | | |- ...
当有一天咱们须要把订单模块拆分红独立服务时,咱们只须要将模块相关的ChangeSet文件迁出来。便可完成数据结构的拆分。app
那如何在一个Spring Boot运行多个SpringLiquibase呢?须要对代码进行如下调整。模块化
当如下配置被启用时,Spring Boot AutoConfigure会使用默认配置初始化名为springLiquibase的Bean。而后咱们不对其进行配置,Spring Boot启动时会报错。微服务
# application.properties # spring boot 2以上 spring.liquibase.enabled=false # spring boot 2如下 liquibase.enabled=false
配置两个SpringLiquibase Bean,Bean名称分别为userLiquibase和orderLiqubase。ui
@Configuration public class LiquibaseConfiguration() { /** * 用户模块Liquibase */ @Bean public SpringLiquibase userLiquibase(DataSource dataSource) { SpringLiquibase liquibase = new SpringLiquibase(); // 用户模块Liquibase文件路径 liquibase.setChangeLog("classpath:liquibase/user/master.xml"); liquibase.setDataSource(dataSource); liquibase.setShouldRun(true); liquibase.setResourceLoader(new DefaultResourceLoader()); // 覆盖Liquibase changelog表名 liquibase.setDatabaseChangeLogTable("user_changelog_table"); liquibase.setDatabaseChangeLogLockTable("user_changelog_lock_table"); return liquibase; } /** * 订单模块Liquibase */ @Bean public SpringLiquibase orderLiquibase() { SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setChangeLog("classpath:liquibase/order/master.xml"); liquibase.setDataSource(dataSource); liquibase.setShouldRun(true); liquibase.setResourceLoader(new DefaultResourceLoader()); liquibase.setDatabaseChangeLogTable("order_changelog_table"); liquibase.setDatabaseChangeLogLockTable("order_changelog_lock_table"); return liquibase; } }
Cheers~~