Activiti 工做流引擎自带建库脚本,同时生成了索引、外键等信息。为了下降外键约束对数据库形成的性能影响,咱们须要将外键删除,下文描述删除外键的工程。注:在互联网系统设计中尽可能保持数据库表的原子性设计。mysql
在 Activiti 中databaseSchemaUpdate
属性设置建表策略,值为 true
是,若是没有表,自动建立表,不然不自动建立表。sql
在 IntelliJ IDEA 中经过 find usages
命令发现,在org.activiti.engine.impl.db.DbSqlSession
类中使用了该属性,代码以下:数据库
public void performSchemaOperationsProcessEngineBuild() { String databaseSchemaUpdate = Context.getProcessEngineConfiguration().getDatabaseSchemaUpdate(); if (ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_DROP_CREATE.equals(databaseSchemaUpdate)) { try { dbSchemaDrop(); } catch (RuntimeException e) { // ignore } } 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)) { dbSchemaUpdate(); } }
在上面代码中,咱们找到了dbSchemaCreate();
方法,该方法负责建立数据库表,代码以下:app
public void dbSchemaCreate() { if (isEngineTablePresent()) { String dbVersion = getDbVersion(); if (!ProcessEngine.VERSION.equals(dbVersion)) { throw new ActivitiWrongDbException(ProcessEngine.VERSION, dbVersion); } } else { dbSchemaCreateEngine(); } if (dbSqlSessionFactory.isDbHistoryUsed()) { dbSchemaCreateHistory(); } if (dbSqlSessionFactory.isDbIdentityUsed()) { dbSchemaCreateIdentity(); } }
经过上面代码能够发现,engine
表、history
表、identity
表三部份内容是分别进行建立的。接着咱们跟踪 dbSchemaCreateEngine()
方法,代码入下:框架
protected void dbSchemaCreateEngine() { executeMandatorySchemaResource("create", "engine"); }
该方法调用executeMandatorySchemaResource()
方法,代码以下:ide
public void executeMandatorySchemaResource(String operation, String component) { executeSchemaResource(operation, component, getResourceForDbOperation(operation, operation, component), false); }
该方法调用getResourceForDbOperation()
方法,此方法用来查找sql
文件的位置,代码以下:性能
public String getResourceForDbOperation(String directory, String operation, String component) { String databaseType = dbSqlSessionFactory.getDatabaseType(); return "org/activiti/db/" + directory + "/activiti." + databaseType + "." + operation + "." + component + ".sql"; }
前面传入的参数值:operation="create", component="engine", directory="create"
,所以该方法的返回值为org/activiti/db/create/activiti.mysql.create.engine.sql
(以 Mysql数据库为例),该sql
文件存放在 activiti-engine-5.22.0.jar 中。ui
为了便于理解,咱们分析一下org/activiti/db/
中的内容,以下图所示:
spa
简要说明:
1. 在 org.activiti.db 包中存放了与数据库相关的内容。
2. create目录:存放建立数据库表的 sql 语句。
3. drop目录:存放删除数据库表的 sql 语句。
4. upgrade目录:存放升级数据库表的 sql 语句,好比将Activiti 从 5.10版本升级至 5.22版本,经过此目录下的 sql 文件进行数据库升级。
5. mapping目录:存放 Mybatis 框架使用的 Mapper配置文件。设计
经过查看如下三个文件来查找建立外键的 sql 语句。
org/activiti/db/create/activiti.mysql.create.engine.sql
org/activiti/db/create/activiti.mysql.create.history.sql
org/activiti/db/create/activiti.mysql.create.identity.sql
alter table ACT_GE_BYTEARRAY add constraint ACT_FK_BYTEARR_DEPL foreign key (DEPLOYMENT_ID_) references ACT_RE_DEPLOYMENT (ID_); alter table ACT_RE_PROCDEF add constraint ACT_UNIQ_PROCDEF unique (KEY_,VERSION_, TENANT_ID_); #惟一索引,无需删除 alter table ACT_RU_EXECUTION add constraint ACT_FK_EXE_PROCINST foreign key (PROC_INST_ID_) references ACT_RU_EXECUTION (ID_) on delete cascade on update cascade; alter table ACT_RU_EXECUTION add constraint ACT_FK_EXE_PARENT foreign key (PARENT_ID_) references ACT_RU_EXECUTION (ID_); alter table ACT_RU_EXECUTION add constraint ACT_FK_EXE_SUPER foreign key (SUPER_EXEC_) references ACT_RU_EXECUTION (ID_); alter table ACT_RU_EXECUTION add constraint ACT_FK_EXE_PROCDEF foreign key (PROC_DEF_ID_) references ACT_RE_PROCDEF (ID_); alter table ACT_RU_IDENTITYLINK add constraint ACT_FK_TSKASS_TASK foreign key (TASK_ID_) references ACT_RU_TASK (ID_); alter table ACT_RU_IDENTITYLINK add constraint ACT_FK_ATHRZ_PROCEDEF foreign key (PROC_DEF_ID_) references ACT_RE_PROCDEF(ID_); alter table ACT_RU_IDENTITYLINK add constraint ACT_FK_IDL_PROCINST foreign key (PROC_INST_ID_) references ACT_RU_EXECUTION (ID_); alter table ACT_RU_TASK add constraint ACT_FK_TASK_EXE foreign key (EXECUTION_ID_) references ACT_RU_EXECUTION (ID_); alter table ACT_RU_TASK add constraint ACT_FK_TASK_PROCINST foreign key (PROC_INST_ID_) references ACT_RU_EXECUTION (ID_); alter table ACT_RU_TASK add constraint ACT_FK_TASK_PROCDEF foreign key (PROC_DEF_ID_) references ACT_RE_PROCDEF (ID_); alter table ACT_RU_VARIABLE add constraint ACT_FK_VAR_EXE foreign key (EXECUTION_ID_) references ACT_RU_EXECUTION (ID_); alter table ACT_RU_VARIABLE add constraint ACT_FK_VAR_PROCINST foreign key (PROC_INST_ID_) references ACT_RU_EXECUTION(ID_); alter table ACT_RU_VARIABLE add constraint ACT_FK_VAR_BYTEARRAY foreign key (BYTEARRAY_ID_) references ACT_GE_BYTEARRAY (ID_); alter table ACT_RU_JOB add constraint ACT_FK_JOB_EXCEPTION foreign key (EXCEPTION_STACK_ID_) references ACT_GE_BYTEARRAY (ID_); alter table ACT_RU_EVENT_SUBSCR add constraint ACT_FK_EVENT_EXEC foreign key (EXECUTION_ID_) references ACT_RU_EXECUTION(ID_); alter table ACT_RE_MODEL add constraint ACT_FK_MODEL_SOURCE foreign key (EDITOR_SOURCE_VALUE_ID_) references ACT_GE_BYTEARRAY (ID_); alter table ACT_RE_MODEL add constraint ACT_FK_MODEL_SOURCE_EXTRA foreign key (EDITOR_SOURCE_EXTRA_VALUE_ID_) references ACT_GE_BYTEARRAY (ID_); alter table ACT_RE_MODEL add constraint ACT_FK_MODEL_DEPLOYMENT foreign key (DEPLOYMENT_ID_) references ACT_RE_DEPLOYMENT (ID_); alter table ACT_PROCDEF_INFO add constraint ACT_FK_INFO_JSON_BA foreign key (INFO_JSON_ID_) references ACT_GE_BYTEARRAY (ID_); alter table ACT_PROCDEF_INFO add constraint ACT_FK_INFO_PROCDEF foreign key (PROC_DEF_ID_) references ACT_RE_PROCDEF (ID_); alter table ACT_PROCDEF_INFO add constraint ACT_UNIQ_INFO_PROCDEF unique (PROC_DEF_ID_); #惟一索引,无需删除
没有建立外键。
alter table ACT_ID_MEMBERSHIP add constraint ACT_FK_MEMB_GROUP foreign key (GROUP_ID_) references ACT_ID_GROUP (ID_); alter table ACT_ID_MEMBERSHIP add constraint ACT_FK_MEMB_USER foreign key (USER_ID_) references ACT_ID_USER (ID_);
咱们找到了建立外键的 sql 语句,接下来建立删除外键的 sql 语句。
alter table ACT_GE_BYTEARRAY drop foreign key ACT_FK_BYTEARR_DEPL; alter table ACT_RE_PROCDEF drop index ACT_UNIQ_PROCDEF; alter table ACT_RU_EXECUTION drop foreign key ACT_FK_EXE_PROCINST; alter table ACT_RU_EXECUTION drop foreign key ACT_FK_EXE_PARENT; alter table ACT_RU_EXECUTION drop foreign key ACT_FK_EXE_SUPER; alter table ACT_RU_EXECUTION drop foreign key ACT_FK_EXE_PROCDEF; alter table ACT_RU_IDENTITYLINK drop foreign key ACT_FK_TSKASS_TASK; alter table ACT_RU_IDENTITYLINK drop foreign key ACT_FK_ATHRZ_PROCEDEF; alter table ACT_RU_IDENTITYLINK drop foreign key ACT_FK_IDL_PROCINST; alter table ACT_RU_TASK drop foreign key ACT_FK_TASK_EXE; alter table ACT_RU_TASK drop foreign key ACT_FK_TASK_PROCINST; alter table ACT_RU_TASK drop foreign key ACT_FK_TASK_PROCDEF; alter table ACT_RU_VARIABLE drop foreign key ACT_FK_VAR_EXE; alter table ACT_RU_VARIABLE drop foreign key ACT_FK_VAR_PROCINST; alter table ACT_RU_VARIABLE drop foreign key ACT_FK_VAR_BYTEARRAY; alter table ACT_RU_JOB drop foreign key ACT_FK_JOB_EXCEPTION; alter table ACT_RU_EVENT_SUBSCR drop foreign key ACT_FK_EVENT_EXEC; alter table ACT_RE_MODEL drop foreign key ACT_FK_MODEL_SOURCE; alter table ACT_RE_MODEL drop foreign key ACT_FK_MODEL_SOURCE_EXTRA; alter table ACT_RE_MODEL drop foreign key ACT_FK_MODEL_DEPLOYMENT; alter table ACT_PROCDEF_INFO drop foreign key ACT_FK_INFO_JSON_BA; alter table ACT_PROCDEF_INFO drop foreign key ACT_FK_INFO_PROCDEF; alter table ACT_PROCDEF_INFO drop index ACT_UNIQ_INFO_PROCDEF;
该部分没有建立外键,所以无需删除外键。
alter table ACT_ID_MEMBERSHIP drop foreign key ACT_FK_MEMB_GROUP; alter table ACT_ID_MEMBERSHIP drop foreign key ACT_FK_MEMB_USER;
删除外键的 sql 语句建立完毕,咱们能够经过执行上面的 sql 语句来删除外键。固然也能够在程序中调用 sql 脚原本删除外键。