概述
目录
- 搭建环境
- 下载源码
- 环境搭建
- 原理
- 数据库连接
- 数据库锁
搭建环境
下载源码
官网地址:https://flywaydb.org/
源码地址:https://repo1.maven.org/maven2/org/flywaydb/flyway-core/6.3.3/flyway-core-6.3.3-sources.jar
环境搭建
- 把下载好的jar包解压后用IDEA打开,
- 新建src,resource,out文件夹,把org文件夹移动到src文件夹中,指定src为 source root,指定resource文件夹为resource root,配置out文件夹为project complier output
如下图所示
- 把pom.xml文件移到根目录下。并右键xuanzhongpom.xml选择import as maven project
- 在pom文件中加入MySQL驱动,如果你使用的是MySQL数据库的话
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
- 新建一个测试类,代码如下
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("执行完了");
}
}
- 运行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 源码解析搭建环境原理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复