• 【Kingbase8数据库】flowable兼容人大金仓Kingbase8过程


    数据库连接配置

    jdbc:kingbase8://xx:54321/b?useUnicode=true&characterEncoding=UTF-8
    spring.datasource.dfeformdb.driver-class-name=com.kingbase8.Driver

    排除非必要jar

    只使用到了bpmn,则dmn和cmmn可以排除

    
                       org.flowable
                       flowable-spring-boot-starter-dmn
                   
                   
                       org.flowable
                       flowable-spring-boot-starter-cmmn
                   
                   
                       org.flowable
                       flowable-dmn-engine
                   
                   
                       org.flowable
                       flowable-dmn-spring
                   
                   
                       org.flowable
                       flowable-cmmn-engine
                   
                   
                       org.flowable
                       flowable-cmmn-spring
                   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    修改liquibase

    配置文件
    在pom.xml文件中加入金仓的依赖:

      
                    com.kingbase8
                    kingbase8-jdbc
                    8.2.0.2
                
                
                    com.kingbase.dialect
                    kingbase8
                    8.2.0.2
                
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    参考官方文档:
    https://help.kingbase.com.cn/v8/development/client-interfaces-frame/liquibase/liquibase-2.html

    修改flowable源码增加数据库类型

    找到AbstractEngineConfiguration.java,在编辑器下根据该java文件的package创建相同的包名,并将其复制到我们自己实现的工程(flowengine)相同包名下,进行修改,插入以下两行

    package org.flowable.common.engine.impl;
    public static Properties getDefaultDatabaseTypeMappings() {
                  databaseTypeMappings.setProperty("KingbaseES", "postgres");
            return databaseTypeMappings;
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    修改源码DatabaseConfiguration.java

    修改支持的数据库类型

     CREATE TABLE PUBLIC.FLW_EV_DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR(255), CONSTRAINT PK_FLW_EV_DATABASECHANGELOGLOCK PRIMARY KEY (ID))
    
    • 1

    在\resources\META-INF\services\liquibase.database.Database配置支持的数据库

    liquibase.database.core.PostgresDatabase
    liquibase.database.core.SQLiteDatabase
    liquibase.database.core.SybaseASADatabase
    liquibase.database.core.SybaseDatabase
    liquibase.database.core.KingbaseDatabase
    liquibase.database.core.UnsupportedDatabase
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    按liquibase.database.core.PostgresDatabase增加支持的数据库类型,public class KingbaseDatabase extends PostgresDatabase

    修改数据库字段类型转换

     CREATE TABLE PUBLIC.FLW_EV_DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR(255), CONSTRAINT PK_FLW_EV_DATABASECHANGELOGLOCK PRIMARY KEY (ID))
    
    • 1

    liquibase.exception.DatabaseException: 错误: 当前事务被终止, 事务块结束之前的查询被忽略

    单独执行sql时发现,不支持datetime类型
    org/flowable/eventregistry/db/liquibase/flowable-eventregistry-db-changelog.xml中

      CREATE TABLE PUBLIC.FLW_EV_DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED datetime, LOCKEDBY VARCHAR(255), CONSTRAINT PK_FLW_EV_DATABASECHANGELOGLOCK PRIMARY KEY (ID))
    
    • 1

    改为

     CREATE TABLE PUBLIC.FLW_EV_DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR(255), CONSTRAINT PK_FLW_EV_DATABASECHANGELOGLOCK PRIMARY KEY (ID))
    
    • 1

    更好的方法是,新增数据库类型。

    com.kingbase8.util.KSQLException: 错误: 关系 “pg_settings” 不存在

    由于kingbase8中不存在 关系 “pg_settings”,只有sys_settings,也由于调用了

    @Override
       public void setConnection(DatabaseConnection conn) {
           super.setConnection(conn);
    
    • 1
    • 2
    • 3

    可以重写liquibase.datatype.core.DateTimeType

    if (database instanceof PostgresDatabase) {
    
    • 1

    改为

    if (database instanceof PostgresDatabase || database instanceof KingbaseDatabase) {
    
    • 1

    liquibase.exception.DatabaseException: 错误: 语法错误 在 “.” 或附近的

    Position: 27 [Failed SQL: (0) CREATE UNIQUE INDEX PUBLIC.ACT_IDX_EVENT_DEF_UNIQ ON PUBLIC.FLW_EVENT_DEFINITION(KEY_, VERSION_, TENANT_ID_)]

    因为金仓不支持liquibase自动生成的创建索引语句,不要带PUBLIC.,在KingbaseDatabase覆盖方法

       @Override
       public boolean getOutputDefaultSchema() {
           return false;
       }
    
    • 1
    • 2
    • 3
    • 4

    参考:https://blog.csdn.net/LuoGuoHua_Xin/article/details/129898193

  • 相关阅读:
    电力电子转战数字IC20220820day65——uvm实战1B
    泛型的约束不止一面
    15.线程同步的几种方法
    用好JAVA中的函数式接口,轻松从通用代码框架中剥离掉业务定制逻辑
    开启生成式AI的探索之旅,亚马逊云科技分享生成式AI热门案例
    盘点一下今年世界杯中国赞助商及联名入圈品牌
    神经网络与深度学习入门必备知识|概论
    【Linux】进程通信 | 管道
    go语法入门2
    云计算等保测评
  • 原文地址:https://blog.csdn.net/luansj/article/details/131519280