activiti6.0源码剖析之操作引擎表

activiti源码剖析之操作引擎表

首先activiti拥有自己的23张表结构,具体表的意义可以看这里的一篇文章Activiti 23张表及7大服务详解,那么我接下来就说一下activiti数据库的生成策略

看一下activiti配置文件


        
        
        
        

        
    
这里再实例化流程引擎配置对象时,指定databaseSchemaUpdate的值来执行数据库表的生成策略。具体值的策略分析如下
databaseSchemaUpdate值 作用
false(默认值) 流程引擎启动时,首先从ACT_GE_PROPERTY表中查询Activiti引擎的版本值,然后获取ProcessEngine接口中定义的VERSION静态变量值,两者进行对比, 如果数据库中的表不存在或者表存在但版本不匹配则直接抛出异常
true 流程引擎启动时会对所有的表进行更新操作(DDL脚本可见upgrade目录下),如果数据库中的表不存在则开始创建表(DDL脚本可见create目录下)
create-drop 流程引擎启动时创建表,流程引擎关闭时删除表(比如processEngine.close())
drop-create 流程引擎启动时首先删除数据库中存在的表,然后创建表(这种方式再删除的时候不需要手动关闭流程引擎)
create l流程引擎启动时直接创建表不管数据库中是否存在表,也就是如果数据库中已经存在了表,那么再次创建就会报错
那么具体是怎么根据databaseSchemaUpdate来生成数据库的呢?在实例化ProcessEngineImpl的时候,完成属性装配之后(想要具体了解可以看这篇文章),执行:
if (processEngineConfiguration.isUsingRelationalDatabase() && processEngineConfiguration.getDatabaseSchemaUpdate() != null) {
            this.commandExecutor.execute(processEngineConfiguration.getSchemaCommandConfig(), new SchemaOperationsProcessEngineBuild());
        }

在这里看SchemaOperationsProcessEngineBuild实现:

代码SchemaOperationsProcessEngineBuild.java

 public Object execute(CommandContext commandContext) {
        DbSqlSession dbSqlSession = commandContext.getDbSqlSession();
        if (dbSqlSession != null) {
            dbSqlSession.performSchemaOperationsProcessEngineBuild();
        }

        return null;
    }

代码DbSqlSession.java

    public void performSchemaOperationsProcessEngineBuild() {
        String databaseSchemaUpdate = Context.getProcessEngineConfiguration().getDatabaseSchemaUpdate();
        log.debug("Executing performSchemaOperationsProcessEngineBuild with setting " + databaseSchemaUpdate);
        if ("drop-create".equals(databaseSchemaUpdate)) {
            try {
                this.dbSchemaDrop();
            } catch (RuntimeException var3) {
                ;
            }
        }

        if (!"create-drop".equals(databaseSchemaUpdate) && !"drop-create".equals(databaseSchemaUpdate) && !"create".equals(databaseSchemaUpdate)) {
            if ("false".equals(databaseSchemaUpdate)) {
                this.dbSchemaCheckVersion();
            } else if ("true".equals(databaseSchemaUpdate)) {
                this.dbSchemaUpdate();
            }
        } else {
            this.dbSchemaCreate();
        }

    }
  • 从这里可以看到如果databaseSchemaUpdate为drop-create,create-drop,create中任意一个都会调用this.dbSchemaCreate();
  • 然后如果是drop-create会在调用这句话之前调用this.dbSchemaDrop();
  • databaseSchemaUpdate为false时,调用this.dbSchemaCheckVersion();这里会先检查版本以及表是否已经存在
  • databaseSchemaUpdate为true时,调用this.dbSchemaUpdate();进行存在即更新,不存在则创建的操作
当然我们也可以通过扩展DbSqlSession类在引擎创建、删除、更新表时执行项目中的DDL脚本,想了解可以参考分享牛的这篇文章activiti修改内置的DDL SQL脚本初始化逻辑

你可能感兴趣的:(activiti6.0源码剖析之操作引擎表)