activiti源碼剖析之操作引擎表
首先activiti擁有自己的23張表結(jié)構(gòu)曹动,具體表的意義可以看這里的一篇文章Activiti 23張表及7大服務(wù)詳解院刁,那么我接下來(lái)就說(shuō)一下activiti數(shù)據(jù)庫(kù)的生成策略
看一下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>
這里再實(shí)例化流程引擎配置對(duì)象時(shí)混稽,指定databaseSchemaUpdate的值來(lái)執(zhí)行數(shù)據(jù)庫(kù)表的生成策略杂彭。具體值的策略分析如下
databaseSchemaUpdate值 | 作用 |
---|---|
false(默認(rèn)值) | 流程引擎啟動(dòng)時(shí)双揪,首先從ACT_GE_PROPERTY表中查詢Activiti引擎的版本值,然后獲取ProcessEngine接口中定義的VERSION靜態(tài)變量值句喷,兩者進(jìn)行對(duì)比镣典, 如果數(shù)據(jù)庫(kù)中的表不存在或者表存在但版本不匹配則直接拋出異常 |
true | 流程引擎啟動(dòng)時(shí)會(huì)對(duì)所有的表進(jìn)行更新操作(DDL腳本可見(jiàn)upgrade目錄下),如果數(shù)據(jù)庫(kù)中的表不存在則開(kāi)始創(chuàng)建表(DDL腳本可見(jiàn)create目錄下) |
create-drop | 流程引擎啟動(dòng)時(shí)創(chuàng)建表唾琼,流程引擎關(guān)閉時(shí)刪除表(比如processEngine.close()) |
drop-create | 流程引擎啟動(dòng)時(shí)首先刪除數(shù)據(jù)庫(kù)中存在的表兄春,然后創(chuàng)建表(這種方式再刪除的時(shí)候不需要手動(dòng)關(guān)閉流程引擎) |
create | l流程引擎啟動(dòng)時(shí)直接創(chuàng)建表不管數(shù)據(jù)庫(kù)中是否存在表,也就是如果數(shù)據(jù)庫(kù)中已經(jīng)存在了表锡溯,那么再次創(chuàng)建就會(huì)報(bào)錯(cuò) |
那么具體是怎么根據(jù)databaseSchemaUpdate來(lái)生成數(shù)據(jù)庫(kù)的呢赶舆?在實(shí)例化ProcessEngineImpl的時(shí)候哑姚,完成屬性裝配之后(想要具體了解可以看這篇文章),執(zhí)行:
if (processEngineConfiguration.isUsingRelationalDatabase() && processEngineConfiguration.getDatabaseSchemaUpdate() != null) {
this.commandExecutor.execute(processEngineConfiguration.getSchemaCommandConfig(), new SchemaOperationsProcessEngineBuild());
}
在這里看SchemaOperationsProcessEngineBuild實(shí)現(xiàn):
代碼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中任意一個(gè)都會(huì)調(diào)用this.dbSchemaCreate();
- 然后如果是drop-create會(huì)在調(diào)用這句話之前調(diào)用this.dbSchemaDrop();
- databaseSchemaUpdate為false時(shí),調(diào)用this.dbSchemaCheckVersion();這里會(huì)先檢查版本以及表是否已經(jīng)存在
- databaseSchemaUpdate為true時(shí)芜茵,調(diào)用this.dbSchemaUpdate();進(jìn)行存在即更新叙量,不存在則創(chuàng)建的操作