前言

camunda流程引擎官方支持的数据库有:MySQL 、MariaDB 、Oracle 、DB2 、PostgreSQL 、SQL Server、H2。对于其他类型的数据库如何支持,尤其是国产数据库的支持,下面以达梦数据库为例进行介绍。对于其他国产数据库如人大金仓、神州通用等也是同样的修改方法,只是需要注意一下对应数据库的方言即可。

一、引入达梦数据库驱动包

在maven工程的Resources目录下建lib目录,放入达梦数据库驱动包Dm7JdbcDriver17.jar,并配置maven为本地引用

dm.jdbc.driver.DmDriver
jdbc
system
${project.basedir}/src/main/resources/lib/Dm7JdbcDriver17.jar

二、配置达梦数据源

url: jdbc:dm://127.0.0.1:5236
username: oa
password: 12345678aA
driver-class-name: dm.jdbc.driver.DmDriver

三、修改camunda代码,支持达梦数据库

1. 修改ProcessEngineConfigurationImpl类的代码

在org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl类的getDefaultDatabaseTypeMappings方法里增加
databaseTypeMappings.setProperty(“DM DBMS”, “dm”);

protected static Properties getDefaultDatabaseTypeMappings() {

    Properties databaseTypeMappings = new Properties();
databaseTypeMappings.setProperty("H2", "h2");
databaseTypeMappings.setProperty(MY_SQL_PRODUCT_NAME, "mysql");
databaseTypeMappings.setProperty(MARIA_DB_PRODUCT_NAME, "mariadb");
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/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("DM DBMS", "dm"); //达梦
return databaseTypeMappings;
}

2. 修改DbSqlSessionFactory类代码

org.camunda.bpm.engine.impl.db.sql.DbSqlSessionFactory类里增加对达梦数据库的语法解析。
public static final String DMDBMS = “dm”;//达梦数据库
public static final String[] SUPPORTED_DATABASES = {MSSQL, DB2, ORACLE, H2, MYSQL, POSTGRES, MARIADB, DMDBMS};

public class DbSqlSessionFactory implements SessionFactory {

  public static final String MSSQL = "mssql";
public static final String DB2 = "db2";
public static final String ORACLE = "oracle";
public static final String H2 = "h2";
public static final String MYSQL = "mysql";
public static final String POSTGRES = "postgres";
public static final String MARIADB = "mariadb";
public static final String DMDBMS = "dm";//达梦数据库
public static final String[] SUPPORTED_DATABASES = {
MSSQL, DB2, ORACLE, H2, MYSQL, POSTGRES, MARIADB, DMDBMS};

并在static方法里增加:

databaseSpecificLimitBeforeStatements.put(DMDBMS, "select * from ( select a.*, ROWNUM rnum from (");
optimizeDatabaseSpecificLimitBeforeWithoutOffsetStatements.put(DMDBMS, "select * from ( select a.*, ROWNUM rnum from (");
databaseSpecificLimitAfterStatements.put(DMDBMS, " ) a where ROWNUM < #{lastRow}) where rnum >= #{firstRow}");
optimizeDatabaseSpecificLimitAfterWithoutOffsetStatements.put(DMDBMS, " ) a where ROWNUM <= #{maxResults})");
databaseSpecificLimitBeforeWithoutOffsetStatements.put(DMDBMS, "");
databaseSpecificLimitAfterWithoutOffsetStatements.put(DMDBMS, "AND ROWNUM <= #{maxResults}");
databaseSpecificInnerLimitAfterStatements.put(DMDBMS, databaseSpecificLimitAfterStatements.get(DMDBMS));
databaseSpecificLimitBetweenStatements.put(DMDBMS, "");
databaseSpecificLimitBetweenFilterStatements.put(DMDBMS, "");
databaseSpecificOrderByStatements.put(DMDBMS, defaultOrderBy);
databaseSpecificLimitBeforeNativeQueryStatements.put(DMDBMS, "");
databaseSpecificDistinct.put(DMDBMS, "distinct"); databaseSpecificEscapeChar.put(DMDBMS, defaultEscapeChar); databaseSpecificDummyTable.put(DMDBMS, "FROM DUAL");
databaseSpecificBitAnd1.put(DMDBMS, "BITAND(");
databaseSpecificBitAnd2.put(DMDBMS, ",");
databaseSpecificBitAnd3.put(DMDBMS, ")");
databaseSpecificDatepart1.put(DMDBMS, "to_number(to_char(");
databaseSpecificDatepart2.put(DMDBMS, ",");
databaseSpecificDatepart3.put(DMDBMS, "))"); databaseSpecificTrueConstant.put(DMDBMS, "1");
databaseSpecificFalseConstant.put(DMDBMS, "0");
databaseSpecificIfNull.put(DMDBMS, "NVL"); databaseSpecificDaysComparator.put(DMDBMS, "${date} <= #{currentTimestamp} - ${days}"); databaseSpecificCollationForCaseSensitivity.put(DMDBMS, ""); addDatabaseSpecificStatement(DMDBMS, "selectHistoricProcessInstanceDurationReport", "selectHistoricProcessInstanceDurationReport_oracle");
addDatabaseSpecificStatement(DMDBMS, "selectHistoricTaskInstanceDurationReport", "selectHistoricTaskInstanceDurationReport_oracle");
addDatabaseSpecificStatement(DMDBMS, "selectHistoricTaskInstanceCountByTaskNameReport", "selectHistoricTaskInstanceCountByTaskNameReport_oracle");
addDatabaseSpecificStatement(DMDBMS, "selectFilterByQueryCriteria", "selectFilterByQueryCriteria_oracleDb2");
addDatabaseSpecificStatement(DMDBMS, "selectHistoricProcessInstanceIdsForCleanup", "selectHistoricProcessInstanceIdsForCleanup_oracle");
addDatabaseSpecificStatement(DMDBMS, "selectHistoricDecisionInstanceIdsForCleanup", "selectHistoricDecisionInstanceIdsForCleanup_oracle");
addDatabaseSpecificStatement(DMDBMS, "selectHistoricCaseInstanceIdsForCleanup", "selectHistoricCaseInstanceIdsForCleanup_oracle");
addDatabaseSpecificStatement(DMDBMS, "selectHistoricBatchIdsForCleanup", "selectHistoricBatchIdsForCleanup_oracle"); addDatabaseSpecificStatement(DMDBMS, "deleteAttachmentsByRemovalTime", "deleteAttachmentsByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteCommentsByRemovalTime", "deleteCommentsByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteHistoricActivityInstancesByRemovalTime", "deleteHistoricActivityInstancesByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteHistoricDecisionInputInstancesByRemovalTime", "deleteHistoricDecisionInputInstancesByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteHistoricDecisionInstancesByRemovalTime", "deleteHistoricDecisionInstancesByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteHistoricDecisionOutputInstancesByRemovalTime", "deleteHistoricDecisionOutputInstancesByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteHistoricDetailsByRemovalTime", "deleteHistoricDetailsByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteExternalTaskLogByRemovalTime", "deleteExternalTaskLogByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteHistoricIdentityLinkLogByRemovalTime", "deleteHistoricIdentityLinkLogByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteHistoricIncidentsByRemovalTime", "deleteHistoricIncidentsByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteJobLogByRemovalTime", "deleteJobLogByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteHistoricProcessInstancesByRemovalTime", "deleteHistoricProcessInstancesByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteHistoricTaskInstancesByRemovalTime", "deleteHistoricTaskInstancesByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteHistoricVariableInstancesByRemovalTime", "deleteHistoricVariableInstancesByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteUserOperationLogByRemovalTime", "deleteUserOperationLogByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteByteArraysByRemovalTime", "deleteByteArraysByRemovalTime_oracle");
addDatabaseSpecificStatement(DMDBMS, "deleteHistoricBatchesByRemovalTime", "deleteHistoricBatchesByRemovalTime_oracle"); constants = new HashMap<String, String>();
constants.put("constant.event", "cast('event' as nvarchar2(255))");
constants.put("constant.op_message", "NEW_VALUE_ || '_|_' || PROPERTY_");
constants.put("constant_for_update", "for update");
constants.put("constant.datepart.quarter", "'Q'");
constants.put("constant.datepart.month", "'MM'");
constants.put("constant.datepart.minute", "'MI'");
constants.put("constant.null.startTime", "null START_TIME_");
constants.put("constant.varchar.cast", "'${key}'");
constants.put("constant.integer.cast", "NULL");
constants.put("constant.null.reporter", "NULL AS REPORTER_");
dbSpecificConstants.put(DMDBMS, constants);

四、修改数据库连接池

如果工程中使用的是阿里巴巴的druid连接池,可能会报如下错误:
Cause: java.lang.IllegalStateException: dbType not support : dm
需要把sql防火墙等功能关闭掉即解决该问题:
spring.datasource.filters=stat,wall,log4j
把这个配置里的wall去掉。

Camunda如何适配国产数据库达梦的更多相关文章

  1. flowable如何适配国产数据库达梦

    前言 flowable6.4.1流程引擎官方支持的数据库有:MySQL.hsql.Oracle.DB2 .postgres.SQL Server.H2.对于其他类型的数据库如何支持,尤其是国产数据库的 ...

  2. 基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作

    由于一个客户朋友的需求,需要我的Winform开发框架支持国产达梦数据库的操作,这个数据库很早就听过,但是真正一般项目用的很少,一般在一些特殊的项目可能需要用到.由于我的Winform开发框架,是基于 ...

  3. 国产达梦数据库的结合Enterprise Library的应用开发

    在上篇<基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作>介绍了如何在Enterprise Library的数据访问层上支持这种神秘的国产数 ...

  4. DB 查询分析器 6.03 如何灵活、快捷地操作国产达梦数据库

    DB 查询分析器 6.03 如何灵活.快捷地操作国产达梦数据库 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 摘要       本文详细地介绍了"万能数据库查询分析器&qu ...

  5. .NETCore 访问国产达梦数据库

    前言 武汉达梦数据库有限公司成立于2000年,为中国电子信息产业集团(CEC)旗下基础软件企业,专业从事数据库管理系统的研发.销售与服务,同时可为用户提供大数据平台架构咨询.数据技术方案规划.产品部署 ...

  6. DBeaver连接达梦|虚谷|人大金仓等国产数据库

    前言 工作中有些项目可能会接触到「达梦.虚谷.人大金仓」等国产数据库,但通常这些数据库自带的连接工具使用并不方便,所以这篇文章记录一下 DBeaver 连接国产数据库的通用模版,下文以达梦为例(其他国 ...

  7. 达梦数据库DM7小结

    除了很多主流的数据库,我们很熟悉之外,越来越多的国产数据库也涌现出来. 这次就小结一些有关武汉的达梦数据库7这个开发版数据库的有别或者需要注意的地方进行一个简单备注吧. 1.第一件大事就是下载.数据库 ...

  8. [开源] .Net 使用 ORM 访问 达梦数据库

    前言 武汉达梦数据库有限公司成立于2000年,为中国电子信息产业集团(CEC)旗下基础软件企业,专业从事数据库管理系统的研发.销售与服务,同时可为用户提供大数据平台架构咨询.数据技术方案规划.产品部署 ...

  9. 国产数据库适配publiccms开源项目

    金仓数据库适配 操作说明: 一.在程序的所有实体层添加schema=”public”(这里的public是根据数据库定义的模式) 二.切换数据库,修改配置文件cms.properties里面的cms. ...

随机推荐

  1. YACS-2022.4-银组

    https://www.iai.sh.cn/contest 2022.04 银组,理论上 \(100+100+30+100\). T1 上锁的抽屉 题目描述 有一个抽屉柜里竖排了 \(n\) 只抽屉. ...

  2. Makefile 简介

    一.引例: #Makefile objects=test1.o test2.o main:$(objects) gcc -o main $(objects) clean: rm main $(obje ...

  3. 火狐浏览器Hackbar安装破解

    1 下载 https://pan.baidu.com/s/18cKoJAam9by7AB168Im57g 64mt 下载后解压到一个固定文件夹下 2 安装 选择xpi进行安装 3 关闭插件更新 点击插 ...

  4. 挖矿病毒分析(centos7)

    因为我在工作的时候被各种挖矿病毒搞过几次,所以在这里整理下我遇到的病毒以及大神们的解决方案. 服务器中挖矿病毒后,最基本的一个特征就是CPU使用率瞬间飙升,此时可以通过top命令进行查看,确认是否有异 ...

  5. JavaWeb学习day7-Response初学3(重定向)

    重定向:web资源收到客户端请求后,通知客户端去访问另外一个web资源 1 protected void doGet(HttpServletRequest req, HttpServletRespon ...

  6. .NET 7 预览版2 中的 ASP.NET Core 更新

    .NET 7 预览版2 现已推出,其中包括对ASP.NET Core 的许多重大改进. 以下是此预览版中新增内容的摘要: 推断来自服务的API 控制器操作参数 SignalR 集线器方法的依赖注入 为 ...

  7. 2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机)

    2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机) https://www.luogu.com.cn/problem/P5231 题意: 给出字符串S和若干T,求S与每个T的 ...

  8. python相关知识理解

    Python3 基础了解 编码  Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串   # -*- coding: cp-1252 -*- 标识符 · 第一个字符 ...

  9. 条件表达式和switch语句

    一,条件表达式相当于(相当于if-else) 1.条件表达式 ? : 由条件运算符组成条件表达式的一般情况为: 表达式1?表达式2:表达式3: 求值规则:如果表达式的值为真,则以表达式2的值作为条件的 ...

  10. Visual Studio之安装(更新,扩展)速度缓慢解决方案

    一.背景 小伙伴们在安装visual studio,或者更新,扩展vs功能时,在家里网速正常的情况下,可能出现进度十分缓慢的问题,如何解决呢? 二.解决思路 修改hosts文件 1.地址:默认安装在 ...