我是靠谱客的博主 失眠秀发,最近开发中收集的这篇文章主要介绍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;
    }

最后

以上就是失眠秀发为你收集整理的flyway 源码解析搭建环境原理的全部内容,希望文章能够帮你解决flyway 源码解析搭建环境原理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部