当前位置:网站首页>Activiti5.22.0扩展支持达国产数据库,以GBase据库为例
Activiti5.22.0扩展支持达国产数据库,以GBase据库为例
2022-07-27 01:12:00 【胡八一】
前言
目前国内部分公司做的项目要求去ioe使用国产的替代方案。数据从异构数据库中迁移到GBase,应用中使用Activiti工作流在替换了数据库驱动后启动过程报错如下:
nested exception is org.activiti.engine.ActivitiException: couldn’t deduct database type from database product name ‘Gbase 8s Server’
原因是:activiti5.22.0内置的数据库类型不支持GBase数据库。
解决方案
将activiti-engine-5.22.0相关源码拷贝到工程src下,保持包路径不变,并做相应修改以支持达梦数据库。
源码地址:https://github.com/Activiti/Activiti/tree/activiti-5.22.0/modules/activiti-engine
具体如下:
1.新建与源文件一模一样的类,包路径也要与源文件一样,新建org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl的源码内容全部复制过来,然后增加成员变量

此时会报错,因为缺少依赖,然后去github把他的pom文件拷贝过来,放到本项目下面。
https://github.com/Activiti/Activiti/tree/activiti-5.22.0/modules/activiti-engine

在刚刚拷贝的org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl,增加成员变量
public static final String DATABASE_TYPE_GBASE = "gbase";
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(“GBase 8s Server”, DATABASE_TYPE_GBASE);
databaseTypeMappings.setProperty(“H2”, DATABASE_TYPE_H2);

3. 在新建org.activiti.engine.impl.db.DbSqlSessionFactory,把源文件内容拷贝过来,然后修改initBulkInsertEnabledMap(String databaseType)
if (“oracle”.equals(databaseType) || “gbase”.equals(databaseType)) {
bulkInsertableMap.put(EventLogEntryEntity.class, Boolean.FALSE); }
4.在org.activiti.engine.impl.db.DbSqlSessionFactory,修改static{}
// gbase
databaseSpecificLimitBeforeStatements.put("gbase ", “”);
databaseSpecificLimitAfterStatements.put("gbase ", “LIMIT #{maxResults}
OFFSET #{firstResult}”);
databaseSpecificLimitBetweenStatements.put("gbase ", “”);
databaseOuterJoinLimitBetweenStatements.put("gbase ", “”);
databaseSpecificOrderByStatements.put("gbase ", 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_GBASE.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_GBASE.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;
}
}

6.右击项目,选择构建模块

7. 构建成功就会在target目录下面生成class文件,然后去jar包里面替换即可。


边栏推荐
- Okaleido tiger is about to log in to binance NFT in the second round, which has aroused heated discussion in the community
- 在线问题反馈模块实战(十五):实现在线更新反馈状态功能
- 次轮Okaleido Tiger即将登录Binance NFT,引发社区热议
- AcWing 2074. 倒计数 模拟
- 基于GoLang实现API短信网关
- How to visit the latest version of burpsuite pro in vain
- 正方形数组的数目(DAY 81)
- 185. All employees with the top three highest wages in the Department (mandatory)
- day6
- 基于.NetCore开发博客项目 StarBlog - (16) 一些新功能 (监控/统计/配置/初始化)
猜你喜欢

哈希表与一致性哈希的原理理解以及应用

Boom 3D全新2022版音频增强应用程序App

Portraiture5 new and upgraded leather filter plug-in artifact

What did kubedmin do?

Redis四大特殊数据类型的学习和理解

Source code analysis of warning notification for skywalking series learning

Integrated water conservancy video monitoring station telemetry terminal video image water level water quality water quantity flow velocity monitoring

Play a parallel multithreaded mcu-mc3172

阿里云技术专家杨泽强:弹性计算云上可观测能力的构建

Inftnews | ggac and China Aerospace ases exclusively produce "China 2065 Collection Edition"
随机推荐
Common questions and answers of software testing interview (divergent thinking, interface, performance, concept,)
MarqueeView实现滑动展示效果
【flask】服务端获取客户端请求的文件
[binary search medium] leetcode 34. find the first and last positions of elements in the sorted array
Skywalking系列学习之告警通知源码分析
Manually build ABP framework from 0 -abp official complete solution and manually build simplified solution practice
Thread.Sleep(0)的作用
1.28亿美元!芬兰量子计算公司IQM获世界基金支持
2513: 小勇学分数(公约数问题)
一体式水利视频监控站 遥测终端视频图像水位水质水量流速监测
AcWing 2074. 倒计数 模拟
论构造函数的原型是谁
仿知乎论坛社区社交微信小程序
shell(38) : ssh端口转发
我的爬虫笔记(七) 通过爬虫实现blog访问量+1
Portraiture5 new and upgraded leather filter plug-in artifact
LabVIEW中编程更改进程的优先级
Portraiture5全新升级版磨皮滤镜插件神器
Worthington果胶酶的特性及测定方案
使用 WebSocket 实现一个网页版的聊天室(摸鱼更隐蔽)