flowable适配达梦数据库


前言

随着信创工具不断发展,工作中我们经常遇到系统需要去适配信创软件情况,本文主要介绍了flowable工作流适配达梦数据库。springboot版本为3.2.11,flowable版本为7.0.1,达梦驱动包版本为8.1.3.140


一、flowable为什么需要适配

flowable支持的数据库有h2、mysql、Oracle、PostgreSQL和DB2。由此可见达梦数据库flowable本身是不支持的,因此我们需要修改配置让flowable能够兼容达梦数据库。

二、适配步骤

1.引入达梦库

pom文件中添加达梦数据库驱动

<dependency>
     <groupId>com.dameng</groupId>
     <artifactId>DmJdbcDriver18</artifactId>
     <version>8.1.3.140</version>
 </dependency>

2.修改数据源

driverClassName: dm.jdbc.driver.DmDriver
#达梦中一般一个用户对应一个模式,compatibleMode=oracle代表适配oracle,如果不添加这个配置在启动时会flowable表存在错误
url: jdbc:dm://127.0.0.1:5236/TEST?compatibleMode=oracle
username: TEST
password: 1234567890

3.修改flowable源码

修改源码部分主要可以分为三步,第一步添加DM DBMS类型,第二步添加DmDatabase,第三步添加DmDatabase文件读取

添加DM DBMS类型

参照org.flowable.common.engine.impl文件夹中AbstractEngineConfiguration类,在我们项目中创建org.flowable.common.engine.impl文件夹并在文件夹中创建AbstractEngineConfiguration类,保证内容完全一致。在getDefaultDatabaseTypeMappings方法中添加DM DBMS识别,如下:

public static Properties getDefaultDatabaseTypeMappings() {
   
   
        Properties databaseTypeMappings = new Properties();
        databaseTypeMappings.setProperty("H2", "h2");
        databaseTypeMappings.setProperty("HSQL Database Engine", "hsql");
        databaseTypeMappings.setProperty("MySQL", "mysql");
        databaseTypeMappings.setProperty("MariaDB", "mysql");
        databaseTypeMappings.setProperty("Oracle", "oracle");
        databaseTypeMappings.setProperty("PostgreSQL", "postgres");
        databaseTypeMappings.setProperty("Microsoft SQL Server", "mssql");
        databaseTypeMappings.setProperty("db2", "db2");
        databaseTypeMappings.setProperty("DB2", "db2");
        databaseTypeMappings.setProperty("DB2/NT", "db2");
        databaseTypeMappings.setProperty("DB2/NT64", "db2");
        databaseTypeMappings.setProperty("DB2 UDP", "db2");
        databaseTypeMappings.setProperty("DB2/LINUX", "db2");
        databaseTypeMappings.setProperty("DB2/LINUX390", "db2");
        databaseTypeMappings.setProperty("DB2/LINUXX8664", "db2");
        databaseTypeMappings.setProperty("DB2/LINUXZ64", "db2");
        databaseTypeMappings.setProperty("DB2/LINUXPPC64", "db2");
        databaseTypeMappings.setProperty("DB2/LINUXPPC64LE", "db2");
        databaseTypeMappings.setProperty("DB2/400 SQL", "db2");
        databaseTypeMappings.setProperty("DB2/6000", "db2");
        databaseTypeMappings.setProperty("DB2 UDB iSeries", "db2");
        databaseTypeMappings.setProperty("DB2/AIX64", "db2");
        databaseTypeMappings.setProperty("DB2/HPUX", "db2");
        databaseTypeMappings.setProperty("DB2/HP64", "db2");
        databaseTypeMappings.setProperty("DB2/SUN", "db2");
        databaseTypeMappings.setProperty("DB2/SUN64", "db2");
        databaseTypeMappings.setProperty("DB2/PTX", "db2");
        databaseTypeMappings.setProperty("DB2/2", "db2");
        databaseTypeMappings.setProperty("DB2 UDB AS400", "db2");
        databaseTypeMappings.setProperty("CockroachDB", "cockroachdb");
        #DM DBMS适配,mysql为默认值
        databaseTypeMappings.setProperty("DM DBMS", "mysql");
        return databaseTypeMappings;
    }

添加DmDatabase

参照liquibase.database.core包中OracleDatabase文件,创建DmDatabase,修改oracle相关配置为dm(达梦)配置,具体参考下面配置:

package liquibase.database.core;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import liquibase.CatalogAndSchema;
import liquibase.Scope;
import liquibase.database.AbstractJdbcDatabase;
import liquibase.database.DatabaseConnection;
import liquibase.database.OfflineConnection;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.DatabaseException;
import liquibase.exception.UnexpectedLiquibaseException;
import liquibase.exception.ValidationErrors;
import liquibase.executor.ExecutorService;
import liquibase.statement.DatabaseFunction;
import liquibase.statement.SequenceCurrentValueFunction;
import liquibase.statement.SequenceNextValueFunction;
import liquibase.statement.core.RawCallStatement;
import liquibase.statement.core.RawSqlStatement;
import liquibase.structure.DatabaseObject;
import liquibase.structure.core.Catalog;
import liquibase.structure.core.Index;
import liquibase.structure.core.PrimaryKey;
import liquibase.structure.core.Schema;
import liquibase.util.JdbcUtils;
import liquibase.util.StringUtil;

public class DmDatabase extends AbstractJdbcDatabase {
   
   
	#达梦数据库项目名称
    private static final String PRODUCT_NAME = "DM DBMS";

    @Override
    protected String getDefaultDatabaseProductName() {
   
   
        return PRODUCT_NAME;
    }

    /**
     * Is this AbstractDatabase subclass the correct one to use for the given connection.
     *
     * @param conn
     */
    @Override
    public boolean isCorrectDatabaseImplementation(DatabaseConnection conn) throws DatabaseException {
   
   
        return PRODUCT_NAME.equalsIgnoreCase(conn.getDatabaseProductName());
    }

    /**
     * If this database understands the given url, return the default driver class name.  Otherwise return null.
     *
     * @param url
     */
    @Override
    public String getDefaultDriver(String url) {
   
   
        if (url.startsWith("jdbc:dm")) {
   
   
            return "dm.jdbc.driver.DmDriver";//达梦数据库driverClass
        }

        return null;
    }

    /**
     * Returns an all-lower-case short name of the product.  Used for end-user selecting of database type
     * such as the DBMS precondition.
     */
    @Override
    public String getShortName() {
   
   
        return "dm";//简称
    }

    @Override
    public Integer getDefaultPort() {
   
   
        return 5236;//端口号
    }

    /**
     * Returns whether this database support initially deferrable columns.
     */
    @Override
    public boolean supportsInitiallyDeferrableColumns() {
   
   
        return true;
    }

    
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值