activiti集成达梦和人大金仓

本文详细介绍了对Activiti引擎配置的修改,包括在`ProcessEngineConfigurationImpl`类中添加对'DM'和'Kingbase'数据库的支持,调整`getDefaultDatabaseTypeMappings()`方法,并在`DbSqlSessionFactory`类中为这两种数据库添加特定的SQL语句和处理方式。同时,对`AbstractQuery`类的排序功能进行了数据库适配,增加了对'DM'数据库的兼容。这些改动确保了Activiti在'DM'和'Kingbase'数据库上的正确运行和性能优化。

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

修改类org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl中添加

 public static final String DATABASE_TYPE_DM = "dm";
public static final String DATABASE_TYPE_KINGBASE = "kingbase";

修改此类下的getDefaultDatabaseTypeMappings()方法 添加

databaseTypeMappings.setProperty("DM DBMS", "dm");
databaseTypeMappings.setProperty("KingbaseES", "kingbase");

修改类org.activiti.engine.impl.db.DbSqlSessionFactory中static块中:添加

databaseSpecificLimitBeforeStatements.put("kingbase", "");
databaseSpecificLimitAfterStatements.put("kingbase", "LIMIT #{maxResults} OFFSET #{firstResult}");
databaseSpecificLimitBetweenStatements.put("kingbase", "");
databaseOuterJoinLimitBetweenStatements.put("kingbase", "");
databaseSpecificOrderByStatements.put("kingbase", defaultOrderBy);
addDatabaseSpecificStatement("kingbase", "insertByteArray", "insertByteArray_postgres");
addDatabaseSpecificStatement("kingbase", "bulkInsertByteArray", "bulkInsertByteArray_postgres");
addDatabaseSpecificStatement("kingbase", "updateByteArray", "updateByteArray_postgres");
addDatabaseSpecificStatement("kingbase", "selectByteArray", "selectByteArray_postgres");
addDatabaseSpecificStatement("kingbase", "selectResourceByDeploymentIdAndResourceName", "selectResourceByDeploymentIdAndResourceName_postgres");
addDatabaseSpecificStatement("kingbase", "selectResourcesByDeploymentId", "selectResourcesByDeploymentId_postgres");
addDatabaseSpecificStatement("kingbase", "insertIdentityInfo", "insertIdentityInfo_postgres");
addDatabaseSpecificStatement("kingbase", "bulkInsertIdentityInfo", "bulkInsertIdentityInfo_postgres");
addDatabaseSpecificStatement("kingbase", "updateIdentityInfo", "updateIdentityInfo_postgres");
addDatabaseSpecificStatement("kingbase", "selectIdentityInfoById", "selectIdentityInfoById_postgres");
addDatabaseSpecificStatement("kingbase", "selectIdentityInfoByUserIdAndKey", "selectIdentityInfoByUserIdAndKey_postgres");
addDatabaseSpecificStatement("kingbase", "selectIdentityInfoByUserId", "selectIdentityInfoByUserId_postgres");
addDatabaseSpecificStatement("kingbase", "selectIdentityInfoDetails", "selectIdentityInfoDetails_postgres");
addDatabaseSpecificStatement("kingbase", "insertComment", "insertComment_postgres");
addDatabaseSpecificStatement("kingbase", "bulkInsertComment", "bulkInsertComment_postgres");
addDatabaseSpecificStatement("kingbase", "selectComment", "selectComment_postgres");
addDatabaseSpecificStatement("kingbase", "selectCommentsByTaskId", "selectCommentsByTaskId_postgres");
addDatabaseSpecificStatement("kingbase", "selectCommentsByProcessInstanceId", "selectCommentsByProcessInstanceId_postgres");
addDatabaseSpecificStatement("kingbase", "selectCommentsByProcessInstanceIdAndType", "selectCommentsByProcessInstanceIdAndType_postgres");
addDatabaseSpecificStatement("kingbase", "selectCommentsByType", "selectCommentsByType_postgres");
addDatabaseSpecificStatement("kingbase", "selectCommentsByTaskIdAndType", "selectCommentsByTaskIdAndType_postgres");
addDatabaseSpecificStatement("kingbase", "selectEventsByTaskId", "selectEventsByTaskId_postgres");
addDatabaseSpecificStatement("kingbase", "insertEventLogEntry", "insertEventLogEntry_postgres");
addDatabaseSpecificStatement("kingbase", "bulkInsertEventLogEntry", "bulkInsertEventLogEntry_postgres");
addDatabaseSpecificStatement("kingbase", "selectAllEventLogEntries", "selectAllEventLogEntries_postgres");
addDatabaseSpecificStatement("kingbase", "selectEventLogEntries", "selectEventLogEntries_postgres");
addDatabaseSpecificStatement("kingbase", "selectEventLogEntriesByProcessInstanceId", "selectEventLogEntriesByProcessInstanceId_postgres");
databaseSpecificLimitBeforeStatements.put("dm", "");
databaseSpecificLimitAfterStatements.put("dm", "LIMIT #{maxResults} OFFSET #{firstResult}");
databaseSpecificLimitBetweenStatements.put("dm", "");
databaseOuterJoinLimitBetweenStatements.put("dm", "");
databaseSpecificOrderByStatements.put("dm", defaultOrderBy);
addDatabaseSpecificStatement("dm", "selectExclusiveJobsToExecute", "selectExclusiveJobsToExecute_integerBoolean");
addDatabaseSpecificStatement("dm", "selectUnlockedTimersByDuedate", "selectUnlockedTimersByDuedate_oracle");
addDatabaseSpecificStatement("dm", "insertEventLogEntry", "insertEventLogEntry_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertVariableInstance", "bulkInsertVariableInstance_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertUser", "bulkInsertUser_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertTask", "bulkInsertTask_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertResource", "bulkInsertResource_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertProperty", "bulkInsertProperty_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertProcessDefinition", "bulkInsertProcessDefinition_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertModel", "bulkInsertModel_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertMembership", "bulkInsertMembership_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertTimer", "bulkInsertTimer_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertMessage", "bulkInsertMessage_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertIdentityInfo", "bulkInsertIdentityInfo_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertIdentityLink", "bulkInsertIdentityLink_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertMembership", "bulkInsertMembership_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertTimer", "bulkInsertTimer_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertMessage", "bulkInsertMessage_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertHistoricVariableInstance", "bulkInsertHistoricVariableInstance_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertHistoricTaskInstance", "bulkInsertHistoricTaskInstance_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertHistoricProcessInstance", "bulkInsertHistoricProcessInstance_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertHistoricIdentityLink", "bulkInsertHistoricIdentityLink_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertHistoricDetailVariableInstanceUpdate", "bulkInsertHistoricDetailVariableInstanceUpdate_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertHistoricFormProperty", "bulkInsertHistoricFormProperty_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertHistoricActivityInstance", "bulkInsertHistoricActivityInstance_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertGroup", "bulkInsertGroup_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertExecution", "bulkInsertExecution_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertMessageEventSubscription", "bulkInsertMessageEventSubscription_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertSignalEventSubscription", "bulkInsertSignalEventSubscription_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertCompensateEventSubscription", "bulkInsertCompensateEventSubscription_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertEventLogEntry", "bulkInsertEventLogEntry_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertDeployment", "bulkInsertDeployment_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertComment", "bulkInsertComment_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertByteArray", "bulkInsertByteArray_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertEventLogEntry", "bulkInsertEventLogEntry_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertDeployment", "bulkInsertDeployment_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertComment", "bulkInsertComment_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertByteArray", "bulkInsertByteArray_oracle");
addDatabaseSpecificStatement("dm", "bulkInsertAttachment", "bulkInsertAttachment_oracle");

修改org.activiti.engine.impl.db.DbSqlSessionFactory类中的initBulkInsertEnabledMap(String databaseType)方法

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

修改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_KINGBASE.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_KINGBASE.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;
                }

            }

最后在在create文件件下追加创建数据库表相关的文件。

 修改后的activiti-engine-5.22.0.jar

### Activiti 流程引擎与人大金仓数据库的集成与兼容性分析 #### 1. **Activiti 的依赖调整** 为了使 Activiti 流程引擎能够兼容人大金仓 KingbaseES 数据库,需对项目的依赖进行适当调整。具体来说,在配置文件中应将原有的 PostgreSQL 连接替换为指向本地 `libs` 目录下的 PostgreSQL JAR 文件[^1]。这一改动的原因在于官方运维团队指出,特定形态的包集已经整合了必要的运行环境。 此外,对于需要适配国产化数据库的工作流应用,可以直接利用经过预处理的 Activiti 5.22.0 版本 JAR 包资源[^2]。该项目已针对神通数据库(兼容达梦数据库)进行了优化,因此无需额外修改即可直接部署到生产环境中。 --- #### 2. **人大金仓的支持特性** 人大金仓 KingbaseES 数据库不仅具备良好的 Oracle 模式兼容能力,还提供了丰富的开发框架支持,其中包括 Hibernate 其他基于 JDBC 的技术栈[^3]。这意味着开发者可以通过标准的 JDBC 接口轻松完成数据交互任务。 在实际项目中,当采用 Hibernate 框架时,通常会定义一个名为 `cfg.xml` 的核心配置文件来初始化 SessionFactory 并获取 session 对象。与此同时,还需要指定 hibernate mapping 文件 (`.hbm.xml`) 来描述实体对象与数据库表之间的映射关系[^5]。由于 Activiti 内部也广泛采用了类似的机制,这使得两者间的协作变得更加顺畅。 --- #### 3. **JDBC 驱动的作用** 作为 Java 应用程序访问关系型数据库的标准接口,JDBC 提供了一套通用的方法集合以便于跨平台操作不同类型的 DBMS 实例[^4]。在此基础上,只要确保所使用的驱动版本匹配目标数据库厂商的要求,则理论上就能够顺利建立通信链路。 例如,假设当前正在尝试对接人大金仓 KingbaseES v8.x 系列产品,则应当引入对应的 jdbc-driver jar 包至工程路径之中;同时更新 persistence 层的相关属性设置如下所示: ```xml <property name="hibernate.connection.driver_class">com.kingbase8.Driver</property> <property name="hibernate.connection.url">jdbc:kingbase8://localhost:54321/mydb</property> <property name="hibernate.dialect">org.hibernate.dialect.KingbaseDialect</property> ``` 上述代码片段展示了如何通过 XML 方式声明连接细节以及方言选项等内容。 --- #### 4. **潜在挑战及解决策略** 尽管存在理论上的可行性,但在实践中仍可能遇到若干障碍,比如 SQL 语法差异、函数调用不一致等问题。对此建议采取以下措施予以应对: - 利用人大金仓提供的迁移工具降低转换成本; - 参考官方文档仔细校验每一步骤的具体实现逻辑; - 如果条件允许的话还可以考虑升级至最新稳定发行版以获得最佳体验效果。 --- ### 总结 综上所述,虽然 Activiti 流程引擎本身并未原生支持人大金仓 KingbaseES 数据库,但借助第三方插件或者自定义扩展完全可以达成预期目的。整个过程涉及到了多个层面的技术要点,包括但不限于依赖管理、配置项设定等方面的知识点。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值