spring集成flyway
最近给公司项目集成flyway,由于我们项目移动端使用的是spring框架,网上看了很多博客,感觉这方面的东西还是很少的,毕竟现在是springboot的天下,大多数都是springboot集成flyway。但是还是有不少公司遗留有spring框架的项目。这里就自己肝一篇,希望能帮到更多想把flyway添加到spring项目中的人。
由于使用的是spring框架。因此我们选择低版本的flyway。
flyway各个版本请到这里去找:https://mvnrepository.com/artifact/org.flywaydb/flyway-core
我们的maven使用的是阿里云的仓库,阿里云仓库中没有低版本的依赖,我们我们需要下载jar包。这里下载的是3.0版本的jar包。
下载的包需要拷贝到项目webapp/WEB-INF/lib中(web项目都会有WEB-INF这个文件夹,只需要找到你项目中web文件夹就行,web文件夹,就是文件夹上有个蓝点的,具体看下图的webapp文件夹)
新建资源目录resources
在其下面建立db/migration(sql文件默认读取此路径下的文件夹中的.sql文件)
在pom.xml中添加,如果不添加,resources中的文件就无法打包到war包中。
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
添加flyway配置类,更多配置请看源代码
package com.dt.flyway; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.FlywayException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource; /**
* @Description: flyway配置类
* @author:
* @Date: 2021/7/12 15:57
* @Copyright: Xi'an Dian Tong Software Co., Ltd. All Rights Reserved.
* @Version 1.0
*/
public class DatabaseFlywayMigration {
protected final static Logger log = LogManager.getLogger("DatabaseFlywayMigration"); public void migrate() throws NamingException {
log.info("DatabaseFlywayMigration-->migrate:flyway开始执行,准备获取数据源");
Context context = new InitialContext();
//获取tomcat中的数据源
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/wxi");
log.info("DatabaseFlywayMigration-->migrate:获取数据源成功,准备执行flyway配置");
Flyway flyway = new Flyway();
// 设置sql脚本文件的编码
flyway.setEncoding("UTF-8");
flyway.setOutOfOrder(true);
flyway.setDataSource(dataSource);
// 设置接受flyway进行版本管理的多个数据库
//flyway.setSchemas("flywaydemo");
// 设置存放flyway metadata数据的表名
flyway.setTable("flyway_schema_history");
// 设置执行migrate操作之前的validation行为
//flyway.setValidationMode(ValidationMode.ALL);
// 设置当validation失败时的系统行为
//flyway.setValidationErrorMode(ValidationErrorMode.FAIL); // 设置当validation失败时的系统行为
try {
flyway.setInitOnMigrate(true);
log.info("DatabaseFlywayMigration-->migrate:配置成功,即将执行sql语句");
flyway.migrate();
log.info("DatabaseFlywayMigration-->migrate:sql语句执行成功,flyway---END");
} catch (FlywayException e) {
log.error("DatabaseFlywayMigration-->migrate:执行sql语句失败,请查看日志排查错误");
flyway.repair();
e.printStackTrace();
}
}
}
在spring的xml中注入flyway配置类的bean(每个spring项目都会带有一个xml文件,用来注册bean,复制的时候注意项目中DatabaseFlywayMigration所在的路径)
<!-- flayway -->
<bean id="flywayMigration1" class="com.dt.flyway.DatabaseFlywayMigration" lazy-init="false" init-method="migrate"> </bean>
到这里,移动端整合flyway就完成了。
以后这些sql语句,只需要放到resources/db/migration文件夹下面即可(但是这些sql命名都是不符合flyway的,需要进行名称的修改)
命名规则:
此处的SQL语句命名需要遵从一定的规范,否则运行的时候flyway会报错。命名规则主要有两种:
仅需要被执行一次的SQL命名以大写的”V”开头,后面跟上”0~9”数字的组合,数字之间可以用“.”或者下划线”“分割开,然后再以两个下划线 _ 分割,其后跟文件名称,最后以.sql结尾。比如,V20210707__create_user.sql、V20210707__add_user.sql。
可重复运行的SQL,则以大写的“R”开头,后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾。。比如,R__truncate_user_dml.sql。
其中,V开头的SQL执行优先级要比R开头的SQL优先级高。
V:固定大写
20210707.01:20210707是日期,后面用.01代表序号
因为flyway的执行是有个顺序的,比如你执行了V2021__create_user,有执行V2020_update_user。就会报错,原因就是2020<2021。所以我们要保证序号是依次增大。
Flyway 是如何比较两个 SQL 文件的先后顺序呢?它采用 采用左对齐原则, 缺位用 0 代替 。举几个例子:
1.0.1.1 比 1.0.1 版本高。
1.0.10 比 1.0.9.4 版本高。
1.0.10 和 1.0.010 版本号一样高, 每个版本号部分的前导 0 会被忽略。
__:这个是两个 _
例如:
V2.0.9__upgrade.sql
V2.0.11__upgrade.sql
V2.0.13__upgrade.sql
V2.0.14__upgrade.sql
spring集成flyway的更多相关文章
- Spring Boot 集成 Flyway 实现数据库版本控制
在项目迭代开发中,难免会有更新数据库 Schema 的情况,比如添加新表.在表中增加字段或者删除字段等,那么当我对数据库进行一系列操作后,如何快速地在其他同事的电脑上同步?如何在测试/生产服务器上快速 ...
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)
Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...
- 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)
你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ...
- 【转】Dubbo使用例子并且和Spring集成使用
一.编写客户端和服务器端共用接口类1.登录接口类public interface LoginService { public User login(String name, String psw ...
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)
硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...
- axis2+spring集成
转载自:http://www.cnblogs.com/linjiqin/archive/2011/07/05/2098316.html 1.新建一个web project项目,最终工程目录如下: 注意 ...
- rabbitMQ第五篇:Spring集成RabbitMQ
前面几篇讲解了如何使用rabbitMq,这一篇主要讲解spring集成rabbitmq. 首先引入配置文件org.springframework.amqp,如下 <dependency> ...
- 从零开始学 Java - Spring 集成 ActiveMQ 配置(二)
从上一篇开始说起 上一篇从零开始学 Java - Spring 集成 ActiveMQ 配置(一)文章中讲了我关于消息队列的思考过程,现在这一篇会讲到 ActivMQ 与 Spring 框架的整合配置 ...
- spring集成常用技术的配置
使用spring集成其他技术,最基本的配置都是模板化的,比如配置视图模板引擎.数据库连接池.orm框架.缓存服务.邮件服务.rpc调用等,以spring的xml配置为例,我将这些配置过程整理出来,并不 ...
随机推荐
- ifconfig显示的网卡信息和我的配置文件名不符
比如我的配置文件, cd /etc/sysconfig/network-scripts/ifcfg-Auto_eth0是这个名称,但是我使用ifconfig显示的信息却是 eth6 Link en ...
- 支持边云协同终身学习特性,KubeEdge子项目Sedna 0.3.0版本发布!
摘要:随着边缘设备数量指数级增长以及设备性能的提升,边云协同机器学习应运而生,以期打通机器学习的最后一公里. 本文分享自华为云社区<支持边云协同终身学习特性,KubeEdge子项目Sedna 0 ...
- RMAN-20208: UNTIL CHANGE is before RESETLOGS change
执行recover操作时: RMAN> recover database; Starting recover at 28-NOV-19 using channel ORA_DISK_1 ...
- 昇腾AI 软硬件全栈平台
昇腾AI 软硬件全栈平台
- Structured Streaming编程 Programming Guide
Structured Streaming编程 Programming Guide Overview Quick Example Programming Model Basic Concepts Han ...
- 使用Nucleus SE实时操作系统
使用Nucleus SE实时操作系统 Using the Nucleus SE real-time operating system 到目前为止,在本系列文章中,我们详细介绍了Nucleus SE提供 ...
- .NET平台系列21:云原生时代 .NET5 雄霸天下
系列目录 [已更新最新开发文章,点击查看详细] 随着互联网持续高歌猛进,相关技术名词也是层出不穷.微服务.容器化.DevOps.ServerLess.FaaS,这两年最火的当属云原生Cloud ...
- C#搞跨平台UI,封装Cef作为Cpf的控件支持Windows,Linux,Mac
终于封装完成了,采用离屏渲染方式,支持JS和C#互相调用,C#方法自动绑定到JS里,中文输入有自动调整输入法位置. 基于开源的CefGlue 移植,本来想用CefSharp,不过这个里面有很多C++的 ...
- Pandas高级教程之:Dataframe的合并
目录 简介 使用concat 使用append 使用merge 使用join 覆盖数据 简介 Pandas提供了很多合并Series和Dataframe的强大的功能,通过这些功能可以方便的进行数据分析 ...
- 【NX二次开发】体消参,移除体参数UF_MODL_delete_body_parms()
例子: 源码: extern DllExport void ufusr(char *param, int *returnCode, int rlen) { UF_initialize(); tag_t ...