flyway 源码解析

搭建环境

下载源码

官网地址:https://flywaydb.org/
源码地址:https://repo1.maven.org/maven2/org/flywaydb/flyway-core/6.3.3/flyway-core-6.3.3-sources.jar

环境搭建

  1. 把下载好的jar包解压后用IDEA打开,
  2. 新建src,resource,out文件夹,把org文件夹移动到src文件夹中,指定src为 source root,指定resource文件夹为resource root,配置out文件夹为project complier output
    如下图所示
    在这里插入图片描述在这里插入图片描述
  3. 把pom.xml文件移到根目录下。并右键xuanzhongpom.xml选择import as maven project
  4. 在pom文件中加入MySQL驱动,如果你使用的是MySQL数据库的话
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
  1. 新建一个测试类,代码如下
public class MainTest {
    public static void main(String[] args) {
        Flyway flyway = Flyway.configure().dataSource("jdbc:mysql://localhost:3306/springclouddemo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai",
                "root", "123456").load();
        flyway.migrate();
        System.out.println("执行完了");
    }
}
  1. 运行main方法,然后就可以在各个地方自己打断点调试了。

下面是我是搭建好的地址:

https://github.com/github-zsw/flyway-core-6.3.3-sources

原理

数据库连接

//userVariablesQuery=SELECT variable_name FROM performance_schema.user_variables_by_thread WHERE variable_value IS NOT NULL
    // #2215: ensure the database is recent enough and the current user has the necessary SELECT grant确保数据库足够新,并且当前用户具有必需的SELEC
    private boolean hasUserVariableResetCapability() {
        try {
            jdbcTemplate.queryForStringList(userVariablesQuery);
            return true;
        } catch (SQLException e) {
            LOG.debug("Disabled user variable reset as "
                    + (database.isMariaDB() ? USER_VARIABLES_TABLE_MARIADB : USER_VARIABLES_TABLE_MYSQL)
                    + "cannot be queried (SQL State: " + e.getSQLState() + ", Error Code: " + e.getErrorCode() + ")");
            return false;
        }
    }

在连接数据库时会先查询performance_schema.user_variables_by_thread 这个表,目的时判断当前用户有查询该表的权限,并确保当前数据库中的数据时最新的,尤其是现在大规模应用数据库集群的情况下,确保当所连接的数据库实例中的数据是完整的尤为重要,那他是怎么怎么确保数据库中的数据是完整的呢,以下为个人理解,如有错误请指正
user_variables_by_thread存储的是用户的变量表,当从库在进行同步数据时会往这个库中存储特定变量,当然其他线程也会往里边存东西,当从库已经和主库同步完了,user_variables_by_thread里边的特定变量就没有了,从这个可以判断当前从库是与主库保持一致的最新数据。

数据库锁

    @Override
    public <T> T lock(Table table, Callable<T> callable) {
        if (database.isPxcStrict()) {
            return super.lock(table, callable);
        }
        return new MySQLNamedLockTemplate(jdbcTemplate, table.toString().hashCode()).execute(callable);
    }

可以看到flyway会判断是否数据库集群再去用不同的锁
集群锁

    @Override
    protected void doLock() throws SQLException {
        jdbcTemplate.execute("SELECT * FROM " + this + " FOR UPDATE");
    }

单实例锁

    private boolean tryLock() throws SQLException {
        return jdbcTemplate.queryForInt("SELECT GET_LOCK(?,10)", lockName) == 1;
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rorschach01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值