使用SpringBoot + activiti6 搭建审批流项目,数据库使用的是MySQL.且我的数据库下存在多个activiti相关的数据库 schema.
配置文件
因为我的数据库下已经存在了一个activiti7的数据库,所以我这次又新建了一个activiti6的数据库,然后在启动的时候没有自动创建表,而是直接进行了activiti 表的查询,并报了如下的错误
然后我就开始跟断点看源码查找问题,发现它走到了如下这段代码org.activiti.engine.impl.db.DbSqlSession(中间代码省略了一部分)
按预想建的是空白数据库,应该要走else的逻辑,怎么会进到if里面呢,我又继续跟了isEngineTablePresent这个方法,很简短,就是看数据库里面表是否存在
继续看isTablePresent方法,问题就出在下面这段代码上了,这个tables返回有内容,导致tables.next()为true
继续看,DatabaseMetaData是一个接口,断点进到了下面com.zaxxer.hikari.pool.HikariProxyDatabaseMetaData#getTables,接着调用父类的com.zaxxer.hikari.pool.ProxyDatabaseMetaData#getTables方法.
this.delegate.getTables(catalog, schemaPattern, tableNamePattern, types); 这段代码进到了com.mysql.cj.jdbc.DatabaseMetaDataUsingInfoSchema这个类中.
继续跟getDatabase()方法.该方法实现在父类com.mysql.cj.jdbc.DatabaseMetaData中
这个时候就看到了schema和catelog的都是null,然后继续跟下去的话sql就变成了如下
根据这个sql执行的结果可以看到我的数据库中是存在数据的
然后就可开始看为什么catalog为null呢,然后就继续看nullDatabaseMeansCurrent这个属性(其实跟到getDatabase()方法的时候已经进到了mysql-connector-java的类中了).
这个属性在com.mysql.cj.jdbc.DatabaseMetaData的定义为
看该类的构造方法可以看到
在com.mysql.cj.conf.PropertyKey类中可以看到
然后跟到com.mysql.cj.conf.DefaultPropertySet
可以看到PropertyDefinitions.PROPERTY_KEY_TO_PROPERTY_DEFINITION
跟到com.mysql.cj.conf.PropertyDefinitions类中,果然发现了nullDatabaseMeansCurrent的定义.
可以看到他的默认值为false.
然后我们在配置文件的数据库链接上加上&nullCatalogMeansCurrent=true,然后重新执行程序.发现数据库表插入正常.问题解决.
最后的配置文件:
参考文章