oracle 调用flowable报错:Could not get property from table ACT_GE_PROPERTY

场景:

公司springboot项目集成 ,数据库使用oralce,首次加载flowable,自加载建表成功,功能正常,但是切换oracle用户,再首次建表时报错如下:

2023-12-11 17:58:03.578  WARN 24280 --- [           main] c.b.m.core.metadata.TableInfoHelper      : Can not find table primary key in Class: "java.util.Map".
2023-12-11 17:58:03.578  WARN 24280 --- [           main] c.b.m.core.injector.DefaultSqlInjector   : interface java.util.Map ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method.
2023-12-11 17:58:04.425  INFO 24280 --- [           main] o.f.s.b.e.EventRegistryAutoConfiguration : No deployment resources were found for autodeployment
2023-12-11 17:58:04.998  INFO 24280 --- [           main] o.f.s.SpringProcessEngineConfiguration   : Found 2 Engine Configurators in total:
2023-12-11 17:58:04.998  INFO 24280 --- [           main] o.f.s.SpringProcessEngineConfiguration   : class org.flowable.eventregistry.spring.configurator.SpringEventRegistryConfigurator (priority:100000)
2023-12-11 17:58:04.998  INFO 24280 --- [           main] o.f.s.SpringProcessEngineConfiguration   : class org.flowable.idm.engine.configurator.IdmEngineConfigurator (priority:150000)
2023-12-11 17:58:04.998  INFO 24280 --- [           main] o.f.s.SpringProcessEngineConfiguration   : Executing beforeInit() of class org.flowable.eventregistry.spring.configurator.SpringEventRegistryConfigurator (priority:100000)
2023-12-11 17:58:05.005  INFO 24280 --- [           main] o.f.s.SpringProcessEngineConfiguration   : Executing beforeInit() of class org.flowable.idm.engine.configurator.IdmEngineConfigurator (priority:150000)
2023-12-11 17:58:06.019  INFO 24280 --- [           main] o.f.s.SpringProcessEngineConfiguration   : Executing configure() of class org.flowable.eventregistry.spring.configurator.SpringEventRegistryConfigurator (priority:100000)
2023-12-11 17:58:23.998 ERROR 24280 --- [           main] o.f.c.e.impl.db.CommonDbSchemaManager    : Could not get property from table ACT_GE_PROPERTY

java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在

2023-12-11 17:58:24.003  INFO 24280 --- [           main] o.f.c.e.impl.db.CommonDbSchemaManager    : upgrading flowable common schema from 6.1.2.0 to 6.5.0.6
2023-12-11 17:58:24.003  INFO 24280 --- [           main] o.f.c.e.impl.db.CommonDbSchemaManager    : Upgrade needed: 6120 -> 6200. Looking for schema update resource for component 'common'
2023-12-11 17:58:24.005  INFO 24280 --- [           main] o.f.c.e.impl.db.CommonDbSchemaManager    : performing upgrade on common with resource org/flowable/common/db/upgrade/flowable.all.upgradestep.6120.to.6200.common.sql
2023-12-11 17:58:24.151 ERROR 24280 --- [           main] o.f.c.e.impl.db.CommonDbSchemaManager    : problem during schema upgrade, statement insert into ACT_GE_PROPERTY values ('common.schema.version', '6.2.0.0', 1)

java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在

分析可知,问题在于,自建表前查询表是否存在时,查询所有用户的表,导致新用户跳出建表,查询业务表时报错。
mysql 可以使用添加配置nullCatalogMeansCurrent=true配置,但是oracle 的database-schema无效

1查询错误位置

首先根据报错日志找到,基本配置文件入口
package org.flowable.eventregistry.spring.configurator;
public void configure(AbstractEngineConfiguration engineConfiguration)

image.png

2调用方法位置:

.m2\repository\org\flowable\flowable-engine-common\6.5.0\flowable-engine-common-6.5.0.jar!\org\flowable\common\engine\impl\db\AbstractSqlScriptBasedDbSchemaManager.class

调用方法:
》》public String getProperty(String propertyName)
》》public boolean isTablePresent(String tableName)

try {
                tables = databaseMetaData.getTables(catalog, schema, tableName, JDBC_METADATA_TABLE_TYPES);
                var10 = tables.next();
            } finally {
                try {
                    if (tables != null) {
                        tables.close();
                    }
                } catch (Exception var18) {
                    this.logger.error("Error closing meta data tables", var18);
                }

            }

3调用位置

.m2\repository\com\oracle\ojdbc6\11.2.0.3\ojdbc6-11.2.0.3.jar!\oracle\jdbc\OracleDatabaseMetaData.class

调用的public synchronized ResultSet getTables(String var1, String var2, String var3, String[] var4) throws SQLException

最终返回OracleResultSet对象
OracleResultSet var24 = (OracleResultSet)var23.executeQuery();
var24.closeStatementOnClose();
return var24;

image.png

执行的sql大致拆解为:

SELECT NULL AS table_cat,
       o.owner AS table_schem,
       o.object_name AS table_name,
       o.object_type AS table_type,
       NULL AS remarks,
       o.owner, o.object_name
  FROM all_objects o
  WHERE 1=1  -- o.owner LIKE :1 ESCAPE '/'
    AND o.object_name LIKE 'ACT_GE_PROPERTY'
    AND o.object_type IN ('xxx', 'TABLE')
image.png

如此oracle默认下查询了多个用户的表空间,

        PreparedStatement var23 = this.connection.prepareStatement(var22);
        var23.setString(1, var2 == null ? "%" : var2);
        var23.setString(2, var3 == null ? "%" : var3);
        if (var12 && this.connection.getRestrictGetTables()) {
            var23.setString(3, var2 == null ? "%" : var2);
            var23.setString(4, var3 == null ? "%" : var3);
        }

4解决办法

由封装的参数可知
1 ESCAPE 为 getTables(String var1, String var2, String var3, String[] var4) 方法中的var2参数
此处将var2参数传入指定用户即可。

追溯上游方法入参为:
public boolean isTablePresent(String tableName) 中的
String schema = dbSqlSession.getConnectionMetadataDefaultSchema();

修改 org.flowable.common.engine.impl.db.DbSqlSession 修改connectionMetadataDefaultSchema 属性即可

在此,本人在项目内重写一个AbstractSqlScriptBasedDbSchemaManager.java抽象类,将
String schema = dbSqlSession.getConnectionMetadataDefaultSchema(); 写死,重启项目生效

org/flowable/common/engine/impl/db/AbstractSqlScriptBasedDbSchemaManager.java

image.png

5还原

将新写的抽象方法注释掉,首次执行时打开,修改指定用户,启动

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容