Activiti5.22.0扩展支持达梦数据库

为解决Activiti引擎在使用达梦数据库时的兼容性问题,本文详细介绍了如何通过修改源码来使Activiti 5.22.0版本支持达梦数据库,包括数据库类型映射、批量插入、限制语句及排序处理等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

        目前国内部分公司做的项目要求去ioe使用国产的替代方案。数据从异构数据库中迁移到达梦,应用中使用Activiti工作流在替换了数据库驱动后启动过程报错如下:

nested exception is org.activiti.engine.ActivitiException: couldn't deduct database type from database product name 'DM DBMS'

        原因是:activiti5.22.0内置的数据库类型不支持达梦数据库。

 

解决方案

        将activiti-engine-5.22.0相关源码拷贝到工程src下,保持包路径不变,并做相应修改以支持达梦数据库。

具体如下:

        1. 在org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl,增加成员变量

public static final String DATABASE_TYPE_DM = "dm";
public static final String DATABASE_TYPE_H2 = "h2";
public static final String DATABASE_TYPE_HSQL = "hsql";
public static final String DATABASE_TYPE_MYSQL = "mysql";
public static final String DATABASE_TYPE_ORACLE = "oracle";

        2. 在org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl,修改getDefaultDatabaseTypeMappings()

protected static Properties getDefaultDatabaseTypeMappings() {
    Properties databaseTypeMappings = new Properties();
    databaseTypeMappings.setProperty("DM DBMS", DATABASE_TYPE_DM);
    databaseTypeMappings.setProperty("H2", DATABASE_TYPE_H2);

        3. 在org.activiti.engine.impl.db.DbSqlSessionFactory,修改initBulkInsertEnabledMap(String databaseType)

if ("oracle".equals(databaseType) || "dm".equals(databaseType)) {
    bulkInsertableMap.put(EventLogEntryEntity.class, Boolean.FALSE);
}

        4. 在org.activiti.engine.impl.db.DbSqlSessionFactory,修改static{}

// dm
databaseSpecificLimitBeforeStatements.put("dm", "");
databaseSpecificLimitAfterStatements.put("dm", "LIMIT #{maxResults} OFFSET #{firstResult}");
databaseSpecificLimitBetweenStatements.put("dm", "");
databaseOuterJoinLimitBetweenStatements.put("dm", "");
databaseSpecificOrderByStatements.put("dm", defaultOrderBy);

// h2
databaseSpecificLimitBeforeStatements.put("h2", "");
databaseSpecificLimitAfterStatements.put("h2", "LIMIT #{maxResults} OFFSET #{firstResult}");
databaseSpecificLimitBetweenStatements.put("h2", "");
databaseOuterJoinLimitBetweenStatements.put("h2", "");
databaseSpecificOrderByStatements.put("h2", defaultOrderBy);

        5. 在 org.activiti.engine.impl.AbstractQuery,修改addOrder(String column, String sortOrder, NullHandlingOnOrder nullHandlingOnOrder)

if (nullHandlingOnOrder.equals(NullHandlingOnOrder.NULLS_FIRST)) {

    if (ProcessEngineConfigurationImpl.DATABASE_TYPE_H2.equals(databaseType) 
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_HSQL.equals(databaseType)
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_POSTGRES.equals(databaseType) 
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_ORACLE.equals(databaseType)
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_DM.equals(databaseType)) {
        orderBy = orderBy + defaultOrderByClause + " NULLS FIRST";
    } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_MYSQL.equals(databaseType)) {
        orderBy = orderBy + "isnull(" + column + ") desc," + defaultOrderByClause;
    } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_DB2.equals(databaseType) 
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_MSSQL.equals(databaseType)) {
        orderBy = orderBy + "case when " + column + " is null then 0 else 1 end," + defaultOrderByClause;
    } else {
        orderBy = orderBy + defaultOrderByClause;
    }

} else if (nullHandlingOnOrder.equals(NullHandlingOnOrder.NULLS_LAST)) {

    if (ProcessEngineConfigurationImpl.DATABASE_TYPE_H2.equals(databaseType) 
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_HSQL.equals(databaseType)
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_POSTGRES.equals(databaseType) 
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_ORACLE.equals(databaseType)
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_DM.equals(databaseType)) {
        orderBy = orderBy + column + " " + sortOrder + " NULLS LAST";
    } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_MYSQL.equals(databaseType)) {
        orderBy = orderBy + "isnull(" + column + ") asc," + defaultOrderByClause;
    } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_DB2.equals(databaseType) 
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_MSSQL.equals(databaseType)) {
        orderBy = orderBy + "case when " + column + " is null then 1 else 0 end," + defaultOrderByClause;
    } else {
        orderBy = orderBy + defaultOrderByClause;
    }
}

        完成以上修改,重新编译activiti-engine-5.22.0.jar启动即可。

 

        修改后,支持达梦数据库的activiti-engine-5.22.0.jar以及涉及到的相关资料,下载地址:https://pan.baidu.com/s/1xzBbSTAbkfWRpG0-T-LeOg   提取码:9472 

### 配置和使用Activiti工作流引擎于达梦数据库 #### 扩展支持概述 为了使Activiti 5.22.0版本能够在达梦数据库上运行,需对其进行特定的扩展支持。这一过程涉及到了多个方面的调整与修改,旨在确保两者之间的无缝集成并满足企业级应用的需求[^1]。 #### 主要改造点 针对`ProcessEngineConfigurationImpl`、`DbSqlSessionFactory`、`AbstractQuery`这几个核心类进行了必要的改动来适应达梦特性。这些更改不仅限于代码层面,在启动时还需执行特制的数据表创建SQL脚本来完成环境准备[^4]。 #### 数据库类型映射配置 通过自定义`databaseTypeMappings`属性的方式,可以向`ProcessEngineConfigurationImpl`中加入对于达梦的支持逻辑。此操作允许系统识别新的数据库种类,并据此采取相应的处理策略[^5]。 #### SQL语句适配 由于不同数据库间存在语法差异,因此需要为达梦编写专门的DDL/DML语句集。这部分通常位于工程内的资源目录下,如`org/activiti/db/create/dm.sql`,用于描述如何构建所需的模式结构及对象[^3]。 #### 初始化设置实例 下面给出了一段简化版Java代码片段展示怎样加载定制化配置: ```java // 加载自定义配置项 ProcessEngine processEngine = new ProcessEngineConfiguration() .setJdbcDriver("DM JDBC驱动名称") .setJdbcUrl("jdbc:dm://localhost:端口号;DATABASENAME=数据库名") .setJdbcUsername("用户名") .setJdbcPassword("密码") .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE) .buildProcessEngine(); ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值