activiti 数据库升级 upgrade

在项目中我们如果使用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的方式进行升级。

时间: 2024-10-11 11:23:59

activiti 数据库升级 upgrade的相关文章

数据库升级问题—ORA-39700: database must be opened with UPGRADE option

1. 错误描述 一个数据较长时间未使用了,最近启动时出现如下错误: SQL> startup Oracle instance started. Total System Global Area 4932501504 bytes Fixed Size                  2103096 bytes Variable Size            889194696 bytes Database Buffers        4026531840 bytes Redo Buffers

探索Oracle之数据库升级二 11.2.0.3升级到11.2.0.4完整步骤

探索Oracle之数据库升级二  11.2.0.3升级到11.2.0.4完整步骤 说明:         这篇文章主要是记录下单实例环境下Oracle 11.2.0.1升级到11.2.0.3的过程,当然RAC的升级是会有所不同.但是他们每个版本之间升级步骤都是差不多的,先升级Database Software,再升级Oracle Instance. Oracle 11.2.0.4的Patchset No:19852360下载需要有Oracle Support才可以.  Patchset包含有7个

数据库升级ora-04063 DBMS_REGISTRY has error

在做Oracle数据库从11.2.0.1.0升级到11.2.0.2.8时,软件升级没有问题,实例升级没有问题,升级psu的时候. 运行@?/rdbms/admin/catbundle psu apply时,只显示一部分信息,即终止apply. 在dba_registry_history中未显示11.2.0.2.8的psu信息: select * from dba_registry_history; ACTION_TIME                    ACTION          NA

iOS 数据库升级 如何进行操作?

在iOS开发中,经常会遇到数据库升级,修改删除表的某些字段,这就需要我们来进行处理了,下面分析两种数据库的升级处理问题! 1.比如:我们常使用fmdb或者其他方式创建sqlite数据库,但是由于版本迭代问题,常常有需求要更新数据库,比如加字段.删除.修改字段等等,怎么样才能升级数据库且保持原来存的数据有效呢,上代码: const static NSInteger FAMILY_LIST_DB_MANAGER_VER = 1; @implementation KSFamilyListDBManag

探索Oracle之数据库升级十 12c(12.1.0.2)CPU 19774304

探索Oracle之数据库升级十 12c(12.1.0.2)CPU 19774304 一.   补丁描述 参考metalink doc: (Doc ID 19774304.8) Bug19774304 - 12.1.0.2 Bundle Patch 2 for Engineered Systems and DB In-Memory (Nov2014) (Doc ID 19774304.8) 二.   补丁包含 19649591 DATABASE BUNDLE PATCH 12.1.0.2.2 (O

探索Oracle之数据库升级四 11.2.0.4.0 PSU 11.2.0.4.3

探索Oracle之数据库升级四 11.2.0.4.0 PSU 11.2.0.4.3   一.  检查当前数据库PSU号: [[email protected] ~]$ cd/DBSoft/Product/11.2.4/db_1/OPatch/ [[email protected] OPatch]$ ls crs docs emdpatch.pl jlib ocm opatch opatch.bat opatchdiag opatchdiag.bat opatch.ini opatch.pl op

Android 数据库升级解决方案

转自:http://blog.csdn.net/leehong2005/article/details/9128501 请考虑如下情况: 在数据库升级时,不同版本的数据库,他们定义的表结构完全可能是不一样的,比如V1.0的表A有10个column,而在V1.1的表A有12个colum,在升级时,表A增加了两列,此时我们应该怎么做呢. 总体思路 1,将表A重命名,改了A_temp. 2,创建新表A. 3,将表A_temp的数据插入到表A. 下面代码列出了更新表的实现,upgradeTables,给

探索Oracle之数据库升级六 11.2.0.4.3 Upgrade12c(12.2.0.1)

探索Oracle之数据库升级六 11.2.0.4.3 Upgrade12c(12.2.0.1) 一.前言:        Oracle 12c发布距今已经一年有余了,其最大亮点是一个可以插拔的数据库(PDB),这是在之前版本没有的:但是如果我们要将以前版本的数据库升级到12c来,那么也应顺其自然的将其变成一个pdb,那么我们的工作不仅包含了数据库软件的升级,同时也包含如何将一个NO-CDB的数据库plug to CDB none. 二.升级要求: 三.升级前准备:        3.1.查看数据

oracle11g数据库升级

Oracle支持周期 Oracle对自己产品也一样,对于自己的产品在不同的时期,支持的强度是不一样的.大体分来,支持的强度分为三个级别:Premier Support(最高优先级的支持),Extended Support(中等优先级的支持),Sustaining Support(最低优先级的支持) 1.从产品发布为期5年的标准支持服务期-Premier support 2.随后为期3年的延展支持服务期---------extended support 3.接下来进入持久支持服务期--------