碰到问题
最近,在作者使用activiti工作流引擎的时候,发现启动时直接报错了这个错误 java.sql.SQLSyntaxErrorException: Table ‘xxx.act_ge_property’ doesn’t exist,我寻思不应该啊,我的库里确实没有这个表,但是activiti引擎会自动创建的啊,随着一步一步摸爬滚打(网上查资料),发现了问题原因。
环境
工作流引擎: activiti 7.1.0.M6
数据库 : mysql
找到原因
activiti引擎启动后,会去判断数据库中是否有和activiti相关的表(act_开头),如果没有则创建表。问题就是在查询有无相关表时,并不是查询当前选中的数据库,而是查询 mysql 的 INFORMATION_SCHEMA.TABLES表,这个表中存了所有数据库的表信息。言简意赅的说,原因就是当前mysql的其他库里有activiti相关表,所以activiti不会再创建,然而用的时候,它又在库中找不到对应表,所以报错了
。
参考文章:https://www.jianshu.com/p/48bf76856051/
解决方案
方案一 、添加mysql连接配置
在mysql连接里添加nullCatalogMeansCurrent=true
例:
url: jdbc:mysql://127.0.0.1:3306/testDB?nullCatalogMeansCurrent=true
方案二、修改源码逻辑
参考文章里有一个解决方案,就是删除其他库的相关表,方法是可行,但感觉这样不是每次都合适。所以作者痛定思痛去源码里找答案,想到它会判断有无存在相关表,那就在判断时做点手脚就可以了😏,思路就是这个思路,下面贴具体方法。
在package org.activiti.engine.impl.db包下的DbSqlSession中,可以看到在1039行有dbSchemaUpdate方法:
找到这两个方法,就好办了,我直接在方法里面打上断点,然后强制返回false,表示当前不存在,需要自动创建表,然后历史表和这个一样的操作,这样就可以不删除其他库里的相关表而自动创建了。嘿嘿。