mysql is双竖线_一个MySQL实例有多个Activiti数据库问题

使用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执行的结果可以看到我的数据库中是存在数据的

e64705ab439da8f1e02ef870758da2e6.png

然后就可开始看为什么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,然后重新执行程序.发现数据库表插入正常.问题解决.

最后的配置文件:

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值