• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Springboot集成Flyway适用于多数据源

武飞扬头像
pp_lan
帮助1

1. Flyway

可以将初始化sql在项目启动时候执行,取代单独的DBN更新包

2. 依赖

  1.  
    <dependency>
  2.  
    <groupId>org.flywaydb</groupId>
  3.  
    <artifactId>flyway-core</artifactId>
  4.  
    <version>5.2.1</version>
  5.  
    </dependency>

3. 配置说明(springboot配置版本)

配置名 配置说明
flyway.baseline-description 对执行迁移时基准版本的描述.
flyway.baseline-on-migrate 当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
flyway.baseline-version 开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
flyway.check-location 检查迁移脚本的位置是否存在,默认false.
flyway.clean-on-validation-error 当发现校验错误时是否自动调用clean,默认false.
flyway.enabled 是否开启flywary,默认true.
flyway.encoding 设置迁移时的编码,默认UTF-8.
flyway.ignore-failed-future-migration 当读取元数据表时是否忽略错误的迁移,默认false.
flyway.init-sqls 当初始化好连接时要执行的SQL.
flyway.locations 迁移脚本的位置,默认db/migration.
flyway.out-of-order 是否允许无序的迁移,默认false.
flyway.password 目标数据库的密码.
flyway.schemas 设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
flyway.sql-migration-prefix 迁移文件的前缀,默认为V.
flyway.sql-migration-separator 迁移脚本的文件名分隔符,默认__
flyway.sql-migration-suffix 迁移脚本的后缀,默认为.sql
flyway.tableflyway 使用的元数据表名,默认为schema_version
flyway.target 迁移时使用的目标版本,默认为latest version
flyway.url 迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
flyway.user 迁移数据库的用户名
flyway.validate-on-migrate 迁移时是否校验,默认为true.

4. API方式集成

  1.  
    package com.hz.pro.artifact.config.migration;
  2.  
     
  3.  
    import org.flywaydb.core.Flyway;
  4.  
    import org.flywaydb.core.api.FlywayException;
  5.  
    import org.slf4j.Logger;
  6.  
    import org.slf4j.LoggerFactory;
  7.  
    import org.springframework.beans.factory.annotation.Autowired;
  8.  
    import org.springframework.context.ApplicationContext;
  9.  
    import org.springframework.context.annotation.DependsOn;
  10.  
    import org.springframework.stereotype.Component;
  11.  
     
  12.  
    import javax.annotation.PostConstruct;
  13.  
    import javax.sql.DataSource;
  14.  
     
  15.  
    /**
  16.  
    * @author pp_lan
  17.  
    * @description
  18.  
    */
  19.  
    @Component
  20.  
    @DependsOn({"dataSource", "slaveDataSource"})
  21.  
    public class DatabaseFlywayMigration {
  22.  
     
  23.  
    private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseFlywayMigration.class);
  24.  
     
  25.  
    @Autowired
  26.  
    private ApplicationContext context;
  27.  
     
  28.  
    @PostConstruct
  29.  
    public void init() {
  30.  
     
  31.  
    initDataSource("dataSource");
  32.  
    initDataSource("slaveDataSource");
  33.  
     
  34.  
    }
  35.  
     
  36.  
    public void initDataSource(String dataSourceName) {
  37.  
     
  38.  
    Flyway flyway = null;
  39.  
    try {
  40.  
    LOGGER.info("【初始化{}开始】", dataSourceName);
  41.  
     
  42.  
    DataSource dataSource = context.getBean(dataSourceName, DataSource.class);
  43.  
    flyway = Flyway.configure()
  44.  
    .dataSource(dataSource)
  45.  
    .locations("/db/migration")
  46.  
    .table("t_version")
  47.  
    .encoding("utf-8")
  48.  
    .outOfOrder(true)
  49.  
    .baselineOnMigrate(true)
  50.  
    .validateOnMigrate(true)
  51.  
    .load();
  52.  
     
  53.  
    flyway.migrate();
  54.  
    LOGGER.info("===========【初始化{}成功】===========", dataSourceName);
  55.  
     
  56.  
    } catch (FlywayException e) {
  57.  
    if (flyway != null) {
  58.  
    flyway.repair();
  59.  
    }
  60.  
    LOGGER.error("===========【初始化{}失败】===========", dataSourceName, e);
  61.  
    }
  62.  
     
  63.  
    }
  64.  
     
  65.  
    }
学新通

5. 屏蔽配置启动方式

springboot中默认使用flyway配置进行加载,使用api方式进行灵活配置时候需要将其(FlywayAutoConfiguration)进行屏蔽,不然会报错,部分报错信息屏蔽方式如下所示

5.1 报错信息

  1.  
    Caused by: java.lang.reflect.InvocationTargetException: null
  2.  
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  3.  
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  4.  
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  5.  
    at java.lang.reflect.Method.invoke(Method.java:498)
  6.  
    at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:70)
  7.  
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
  8.  
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
  9.  
    ... 18 common frames omitted
  10.  
    Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema(s) `xxxx` without schema history table! Use baseline() or set baselineOnMigrate to true to initialize the schema history table.
  11.  
    at org.flywaydb.core.Flyway$1.execute(Flyway.java:1371)
  12.  
    at org.flywaydb.core.Flyway$1.execute(Flyway.java:1341)
  13.  
    at org.flywaydb.core.Flyway.execute(Flyway.java:1696)
  14.  
    at org.flywaydb.core.Flyway.migrate(Flyway.java:1341)
  15.  
    ... 25 common frames omitted
学新通

5.2 屏蔽方法

  1.  
    import org.springframework.boot.SpringApplication;
  2.  
    import org.springframework.boot.autoconfigure.SpringBootApplication;
  3.  
    import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
  4.  
     
  5.  
    @SpringBootApplication(exclude = {FlywayAutoConfiguration.class})
  6.  
    public class HzBaseApplication {
  7.  
     
  8.  
    public static void main(String[] args) {
  9.  
    SpringApplication.run(HzBaseApplication.class, args);
  10.  
    }
  11.  
     
  12.  
    }

6. 执行结果

6.1 日志

  1.  
    2023-05-25 10:23:22.596 INFO 161831 --- [ main] c.h.p.a.c.m.DatabaseFlywayMigration : 【初始化dataSource开始】
  2.  
    2023-05-25 10:23:22.607 INFO 161831 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 5.2.1 by Boxfuse
  3.  
    2023-05-25 10:23:22.612 INFO 161831 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
  4.  
    2023-05-25 10:23:22.917 INFO 161831 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
  5.  
    2023-05-25 10:23:22.943 WARN 161831 --- [ main] o.f.c.internal.database.base.Database : Flyway upgrade recommended: PostgreSQL 14.2 is newer than this version of Flyway and support has not been tested.
  6.  
    2023-05-25 10:23:23.140 INFO 161831 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 1 migration (execution time 00:00.089s)
  7.  
    2023-05-25 10:23:23.291 INFO 161831 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema "public": 1.0.0
  8.  
    2023-05-25 10:23:23.291 WARN 161831 --- [ main] o.f.core.internal.command.DbMigrate : outOfOrder mode is active. Migration of schema "public" may not be reproducible.
  9.  
    2023-05-25 10:23:23.305 INFO 161831 --- [ main] o.f.core.internal.command.DbMigrate : Schema "public" is up to date. No migration necessary.
  10.  
    2023-05-25 10:23:23.353 INFO 161831 --- [ main] c.h.p.a.c.m.DatabaseFlywayMigration : ===========【初始化dataSource成功】===========
  11.  
    2023-05-25 10:23:23.353 INFO 161831 --- [ main] c.h.p.a.c.m.DatabaseFlywayMigration : 【初始化slaveDataSource开始】
  12.  
    2023-05-25 10:23:23.368 INFO 161831 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Starting...
  13.  
    2023-05-25 10:23:23.526 INFO 161831 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Start completed.
  14.  
    2023-05-25 10:23:23.542 WARN 161831 --- [ main] o.f.c.internal.database.base.Database : Flyway upgrade recommended: PostgreSQL 14.2 is newer than this version of Flyway and support has not been tested.
  15.  
    2023-05-25 10:23:23.709 INFO 161831 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 1 migration (execution time 00:00.068s)
  16.  
    2023-05-25 10:23:23.885 INFO 161831 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema "public": 1.0.0
  17.  
    2023-05-25 10:23:23.886 WARN 161831 --- [ main] o.f.core.internal.command.DbMigrate : outOfOrder mode is active. Migration of schema "public" may not be reproducible.
  18.  
    2023-05-25 10:23:23.902 INFO 161831 --- [ main] o.f.core.internal.command.DbMigrate : Schema "public" is up to date. No migration necessary.
  19.  
    2023-05-25 10:23:23.949 INFO 161831 --- [ main] c.h.p.a.c.m.DatabaseFlywayMigration : ===========【初始化slaveDataSource成功】===========
学新通

6.2 数据库验证

学新通

 7. 扩展多数据源

多数据源通过buildConfiguration构建多个配置(数据源及script脚本),执行多次即可完成多数据源sql的初始化。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgjgaje
系列文章
更多 icon
同类精品
更多 icon
继续加载