activiti源码剖析之操作引擎表
首先activiti拥有自己的23张表结构,具体表的意义可以看这里的一篇文章Activiti 23张表及7大服务详解,那么我接下来就说一下activiti数据库的生成策略
看一下activiti配置文件
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db_activiti" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="1234" />
<property name="databaseSchemaUpdate" value="true" />
</bean>
这里再实例化流程引擎配置对象时,指定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();进行存在即更新,不存在则创建的操作
网友评论