activiti 数据库升级 upgrade
分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519)
在项目中我们如果使用activiti 工作流引擎的时候,肯定是需要数据库支持的,如果有一天我们打算升级activiti 工作流引擎的时候,那么对应的数据库表或者视图也是需要升级,因为有可能表结构有调整,举例:activiti 5.14的时候act_re_deployment表中没有tenant_id_字段,activiti 5.19有这个字段了,那我们升级的时候,肯定需要升级数据库了,下面详细的讲解如何升级数据库。
1.1.1. 第一种方式 手动sql方式
我们首先打开我们下载的activiti 工程,目录结构如下所示:
打开database目录,结构如下图所示:
目录说明:
create 数据库、表视图、索引的创建脚本。
drop 数据库、表视图、索引的删除脚本。(删除引擎最好这种方式删除的比较干净)
upgrade 数据库、表视图、索引的升级脚本。
目录里面的sql命名规范:
activiti.db2.create.history.sql
activiti:activiti工作流的标示。
db2 数据库厂商的名称(可以是mysql、h2、oracle、postgres等)比如我用的是postgres数据库,那么操作的时候选择activiti.postgres开头的即可。
create:创建数据库的意思,那对应的肯定有drop、upgradestep标示符,操作的时候选择对应的即可。
最后一个标示符history,因为sql创建表的时候分为三个大的sql脚本。
1.engine核心的创建表语句、主要是ru*表等。
2.history 主要创建工作流的hi*表。
3.identity 主要创建工作流的用户表、id*以及用户信息表(扩展表的时候可以不使用这个,后面权限构建章节会详细讲解)
上面对目录做了一个介绍,接下来就进入upgrade目录中,如下图所示是upgrade表中的部分sql脚本:
升级数据库的时候比如说53to.43.xx.sqll升级的时候 53代表当前的activiti 版本,54标示需要升级到的版本。选择需要升级的数据库表的sql对应版本即可。
activiti对应的版本信息如下:
1.1.2. 第二种方式 配置方式
//主要是配置activiti 工作流引擎自定义的一些属性信息。
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> property name="databaseSchemaUpdate" value="drop-create"></property> </bean> <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"> <property name="processEngineConfiguration" ref="processEngineConfiguration" /> </bean>
这里说明一下我们使用的主要的工作流对象是processEngine,从这个对象中获取各个xxxService,processEngine是需要processEngineConfiguration对象中的属性的,就好比你你去找工作,总要把自己的属性提升提升吧,换换衣服,刮刮胡子之类的。
我们接下来重点看一下ProcessEngineImpl中的源码。主要看是数据库创建、删除、更新操作底层是如何实现的。
ProcessEngineImpl继承关系如下图所示:
ProcessEngineImpl类的构造方法如下:
public ProcessEngineImpl(ProcessEngineConfigurationImpl processEngineConfiguration) { ... commandExecutor.execute(processEngineConfiguration.getSchemaCommandConfig(), new SchemaOperationsProcessEngineBuild()); ... }
下面我们重点看一下commandExecutor.execute(processEngineConfiguration.getSchemaCommandConfig(), new SchemaOperationsProcessEngineBuild());方法,这个方法就是进行数据库表的创建、更新以及删除操作。看看这个方法是怎么获取配置文件然后操作数据库的,我们不仅要知道怎么配置,更重要的是知道配置在activiti中是如何解析使用的。
//这是一个典型的命令模式,这里我们先看一下这个SchemaOperationsProcessEngineBuild 命令是如何使用的,关于activiti Command 模式我们会在后面的文章详细的讲解
public final class SchemaOperationsProcessEngineBuild implements Command<Object> { public Object execute(CommandContext commandContext) { commandContext .getSession(DbSqlSession.class) .performSchemaOperationsProcessEngineBuild(); return null; } }
下面看一下performSchemaOperationsProcessEngineBuild方法中的操作:
打开类org.activiti.engine.impl.db.DbSqlSession中的performSchemaOperationsProcessEngineBuild方法如下所示:
public static final String DB_SCHEMA_UPDATE_CREATE = "create"; public static final String DB_SCHEMA_UPDATE_DROP_CREATE = "drop-create"; public void performSchemaOperationsProcessEngineBuild() { //这个方法就是获取 上面的<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> property name="databaseSchemaUpdate" value="drop-create"></property> </bean>中的配置的信息 默认不配置 是false String databaseSchemaUpdate = Context.getProcessEngineConfiguration().getDatabaseSchemaUpdate(); //drop-create 删除表重新创建 if (ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_DROP_CREATE.equals(databaseSchemaUpdate)) { try { //删除操作 dbSchemaDrop(); } catch (RuntimeException e) { // ignore } } //配置的是 create-drop drop-create create三个中的任意一个 if ( org.activiti.engine.ProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP.equals(databaseSchemaUpdate) || ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_DROP_CREATE.equals(databaseSchemaUpdate) || ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_CREATE.equals(databaseSchemaUpdate) ) { //创建操作 dbSchemaCreate(); } else if (org.activiti.engine.ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE.equals(databaseSchemaUpdate)) { //检查版本 dbSchemaCheckVersion(); } else if (ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE.equals(databaseSchemaUpdate)) { //设置true就更新操作 dbSchemaUpdate(); } }
这个时候我们已经很明确参数配置的含义,以及配置参数后引擎的处理。关于activiti 工作流引擎中如何打开数据库操作表、如何更新表,因为这个地方比较负责设计mybstis内容,这个也在后面的章节讲解,然后举一反三的把这个原理也说一下。
最后,我们总结一下两种方式的优缺点:
1.第一种方式最好,sql直接运行,在数据库层面操作,速度比较快。
2.第二种方式,需要配置,是在程序级别操作,肯定还需要打开数据库连接操作,如果打开数据库连接则比较消耗性能。如果自己扩展了activti 工作流的表,可能会引起不必要的麻烦。
3.个人推荐使用第一种直接运行sql的方式进行升级。
activiti 数据库升级 upgrade的更多相关文章
- Oracle数据库升级(10.2.0.4->11.2.0.4)
环境: RHEL5.4 + Oracle 10.2.0.4 目的: 在本机将数据库升级到11.2.0.4 之前总结的Oracle数据库异机升级:http://www.cnblogs.com/jyzha ...
- Android 数据库升级解决方案
转自:http://blog.csdn.net/leehong2005/article/details/9128501 请考虑如下情况: 在数据库升级时,不同版本的数据库,他们定义的表结构完全可能是不 ...
- MySQL/MariaDB/Percona数据库升级脚本
MySQL/MariaDB/Percona数据库升级脚本截取<OneinStack>中upgrade_db.sh, 一般情况下不建议升级数据库版本,该脚本专提供给各位版本控们.为防止大版本 ...
- 探索Oracle数据库升级6 11.2.0.4.3 Upgrade12c(12.1.0.1)
探索Oracle数据库升级6 11.2.0.4.3 Upgrade12c(12.1.0.1) 一.前言: Oracle 12c公布距今已经一年有余了,其最大亮点是一个能够插拔的数据库(PD ...
- oracle11g数据库升级数据库升级
Oracle对自己产品也一样,对于自己的产品在不同的时期,支持的强度是不一样的.大体分来,支持的强度分为三个级别:Premier Support(最高优先级的支持),Extended Support( ...
- Oracle数据库升级前必要的准备工作
Oracle数据库升级向来是一门纷繁复杂的工程,DBA需要为产品数据库的升级耗费大量时间精力在准备工作上:因为其升级复杂度高,所以即便做了较为充分的准备仍可能在升级过程中遇到意想不到的问题,为了更高效 ...
- 探索Oracle之数据库升级八 12c Downgrade 11gR2
探索Oracle之数据库升级八 12c Downgrade 11gR2 前言: 我们前面已经完毕了11gR2 upgrade to 12c 的升级,整个过程还是比較顺利的,尽管和曾经版本号升级有些不太 ...
- 生产环境中,数据库升级维护的最佳解决方案flyway
官网:https://flywaydb.org/ 转载:http://casheen.iteye.com/blog/1749916 1. 引言 想到要管理数据库的版本,是在实际产品中遇到问题后想到的 ...
- Android数据库升级
随着Android应用版本的迭代,经常遇到数据库表结构发生改变,或者一些指定的表数据需要更新.这也就引出一个问题Android数据库的更新问题. Android数据库升级分类 Android数据库更新 ...
随机推荐
- [LeetCode] Design Log Storage System 设计日志存储系统
You are given several logs that each log contains a unique id and timestamp. Timestamp is a string t ...
- Python系列之 - python数据类型
原链接:https://blog.csdn.net/m0_37745438/article/details/79572884 学习一门语言,往往都是从Hello World开始. 但是笔者认为,在一个 ...
- [USACO13OPEN]重力异常
题目描述 船长正在拯救她的船员,Beefalo 博士. 和所有伟大的冒险故事一样,这个故事也是发生在一个2D平面上的.囧 这个平面是M*N的格子组成的网格,代表着船长的世界的一个侧视图. 有些格子是空 ...
- ●HDU 2871 Memory Control(Splay)
●赘述题目 四种操作: ○Reset:将整个内存序列清空. ○New a:在尽量靠左的位置新建一个长度为a的内存块,并输出改内存块起始位置.(各个内存块即使相邻也不会合并..) ○Free a:将a点 ...
- [BZOJ]1052 覆盖问题(HAOI2007)
三矩形覆盖问题啊……不过听说FJOI还出过双圆覆盖问题? Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来, ...
- 使用jquery.qrcode.js生成二维码
通常生成二维码的方式有两种:第一种是java代码的形式,第二种是通过Js方式. 在这里我做个记录,用js生成二维码,可以在官网下载源码:http://jeromeetienne.github.io/j ...
- C++11的原子量与内存序浅析
一.多线程下共享变量的问题 在多线程编程中经常需要在不同线程之间共享一些变量,然而对于共享变量操作却经常造成一些莫名奇妙的错误,除非老老实实加锁对访问保护,否则经常出现一些(看起来)匪夷所思的情况.比 ...
- 利用maven install jar到项目当中
接着上面利用maven打好的jar包.把刚刚打好的包放入其他项目当中怎么办? 只需要在相同的目录下执行mvn install,maven会自动把jar放到本地仓库中. 这样,原先maven项目中缺少依 ...
- 用IO创建并格式化分区
转载:http://raylinn.iteye.com/blog/570274 BOOL Result; // used to read bad DeviceIoControl calls DWORD ...
- 四柱加强版汉诺塔HanoiTower----是甜蜜还是烦恼
我想很多人第一次学习递归的时候,老师或者书本上可能会举汉诺塔的例子. 但是今天,我们讨论的重点不是简单的汉诺塔算法,而是三柱汉诺塔的延伸.先来看看经典的三柱汉诺塔. 一.三柱汉诺塔(Hanoi_Thr ...