时间:2021-07-01 10:21:17 帮助过:2人阅读
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是否被使用(默认使用),使用了就创建相关的表。这里很明显就是isEngineTablePresent()返回了true才导致了这个问题,继续追踪到这个类中的isTablePresent()方法,其真正作用的是下面这段:
public static String[] JDBC_METADATA_TABLE_TYPES = {"TABLE"}; try { tables = databaseMetaData.getTables(catalog, schema, tableName, JDBC_METADATA_TABLE_TYPES); return tables.next(); } finally { try { tables.close(); } catch (Exception e) { log.error("Error closing meta data tables", e); } }
tables.next()返回了true,那么问题肯定是出在了databaseMetaData.getTables()这条语句上。断点发现前两个参数都是null,tableName就是验证的表act_ru_execution。最后一个上面以给出,就是字符串数组,里面只有一个“TABLE”字符串。这个方法具体出在第二个参数上面。具体的参数含义可以百度,这里提供一个链接(侵删):http://blog.sina.com.cn/s/blog_707a9f0601014y1a.html
第二个参数对于oracle数据库来说比较重要,就像之前说的造成这个问题的两种可能的场景。如果出现了这个问题,就需要配置,使schema这个参数为大写的登陆用户名(必须大写,与oracle的机制有关)。这个参数的设置,不断向上查找源码,会发现只需要在配置文件中配置databaseSchema属性就可以了(value大写)。mysql数据库应该就没有太大问题了。
最后简单介绍一下activiti数据库表的组成。之前看创建数据库的sql语句就很清楚,表分为必要的engine和非必要的history以及identity。其中act_hi_*这8张表就与history相关。act_id_*这4张与identity有关。剩余的全是engine必备的表,也可以简单的分下类:act_ru_*这6张表是runtime流程运行中相关的表。act_re_*这3张表是repository这个是管理部署和流程定义相关的表,基本不会改变,除非更改部署和流程定义。act_ge_property存放了数据库表版本的相关信息,只有在升级版本的时候会改变。act_ge_bytearray存放了一些字节流数据,一般是各种资源数据如流程定义的xml,流程图等。act_evt_log看名字就知道是事件日志的表,如何使用暂时不知。最后一张act_procdef_info表看名字也就是流程定义详情表。那些归类了得表具体作用看*,其后缀的名字,大概就知道其具体作用,如:task(任务)、variable(变量)等,这里就不一一介绍了。
activiti搭建(一)初始化数据库
标签: