Activiti支持达梦数据库
1.目的
Activiti现在支持的数据库包括:
Activiti数据库类型 | JDBC URL实例 | 备注 |
---|---|---|
h2 | jdbc:h2:tcp://localhost/activiti | 默认配置的数据库 |
mysql | jdbc:mysql://localhost:3306/activiti?autoReconnect=true | 使用mysql-connector-java驱动测试 |
oracle | jdbc:oracle:thin:@localhost:1521:xe | |
postgres | jdbc:postgresql://localhost:5432/activiti | |
db2 | jdbc:db2://localhost:50000/activiti | |
mssql | jdbc:sqlserver://localhost:1433/activiti |
随着信创国产化的推进,需要用国产数据库来替换上面的数据库。基于达梦数据库对Oracle的高度兼容,我们选择使用达梦数据库作为替代产品。由于Activiti不支持达梦数据库,所以要进行如下的修改。
2.解决方案
2.1 开发环境
2.1.1 相关软件的版本:
软件名称 | 版本 |
---|---|
Activiti | 7.0.1 M6 |
达梦数据库 | 8.0 |
dm.jdbc.driver.DmDriver | 8.1.1.88 |
2.1.2 引入达梦数据库连接驱动包
将达梦数据库驱动包“DmJdbcDriver18.jar”文件上传至阿里云私有maven仓库,并通过maven下载引入。
2.1.3 配置数据库连接
在activiti.cfg.xml文件中添加一下内容
<!--数据源配置dbcp-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="dm.jdbc.driver.DmDriver" />
<property name="url" value="jdbc:dm://192.168.1.109:5236/DAMENG" />
<property name="username" value="ACTIVITI" />
<property name="password" value="dameng123" />
</bean>
2.2 java类
为了使Activiti可以适配达梦数据库,需要修改其部分源代码。将Activiti中相关的源代码拷贝到工程src目录下,保持包路径不变。具体的修改如下:
2.2.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";
public static final String DATABASE_TYPE_POSTGRES = "postgres";
public static final String DATABASE_TYPE_MSSQL = "mssql";
public static final String DATABASE_TYPE_DB2 = "db2";
2.2.2 修改org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl 类的 getDefaultDatabaseTypeMappings()方法
public static Properties getDefaultDatabaseTypeMappings() {
Properties databaseTypeMappings = new Properties();
databaseTypeMappings.setProperty("DM DBMS", DATABASE_TYPE_DM); // 适配达梦数据库,追加修改
databaseTypeMappings.setProperty("H2", DATABASE_TYPE_H2);
databaseTypeMappings.setProperty("HSQL Database Engine", DATABASE_TYPE_HSQL);
databaseTypeMappings.setProperty("MySQL", DATABASE_TYPE_MYSQL);
databaseTypeMappings.setProperty("Oracle", DATABASE_TYPE_ORACLE);
databaseTypeMappings.setProperty("PostgreSQL", DATABASE_TYPE_POSTGRES);
......
}
2.2.3 修改org.activiti.engine.impl.db.DbSqlSessionFactory 类的 initBulkInsertEnabledMap(String databaseType)方法
protected void initBulkInsertEnabledMap(String databaseType) {
bulkInsertableMap = new HashMap<Class<? extends Entity>, Boolean>();
for (Class<? extends Entity> clazz : EntityDependencyOrder.INSERT_ORDER) {
bulkInsertableMap.put(clazz, Boolean.TRUE);
}
// Only Oracle is making a fuss in one specific case right now
// 适配达梦数据库,追加修改
if ("oracle".equals(databaseType) || "dm".equals(databaseType)) {
bulkInsertableMap.put(EventLogEntryEntityImpl.class, Boolean.FALSE);
}
}
2.2.4 修改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;
}
}
2.3 资源文件
Activiti在运行期间还会用的一下资源文件,这些文件中有些也与数据库相关,具体修改如下:
2.3.1 为资源文件创建相应的目录,具体的目录结构如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S33ifGnG-1612670121813)(/Users/zhangzhe/Library/Application Support/typora-user-images/image-20210207112144768.png)]
2.3.2 在create文件件下追加创建数据库表相关的文件。
activiti.dm.create.engine.sql
create table ACT_GE_PROPERTY (
NAME_ NVARCHAR2(64),
VALUE_ NVARCHAR2(300),
REV_ INTEGER,
primary key (NAME_)
);
insert into ACT_GE_PROPERTY
values ('schema.version', '7.0.0.0', 1);
insert into ACT_GE_PROPERTY
values ('schema.history', 'create(7.0.0.0)', 1);
insert into ACT_GE_PROPERTY
values ('next.dbid', '1', 1);
create table ACT_GE_BYTEARRAY (
ID_ NVARCHAR2(64),
REV_ INTEGER,
NAME_ NVARCHAR2(255),
DEPLOYMENT_ID_ NVARCHAR2(64),
BYTES_ BLOB,
GENERATED_ NUMBER(1,0) CHECK (GENERATED_ IN (1,0)),
primary key (ID_)
);
create table ACT_RE_DEPLOYMENT (
ID_ NVARCHAR2(64),
NAME_ NVARCHAR2(255),
CATEGORY_ NVARCHAR2(255),
KEY_ NVARCHAR2(255),
TENANT_ID_ NVARCHAR2(255) DEFAULT '',
DEPLOY_TIME_ TIMESTAMP(6),
ENGINE_VERSION_ NVARCHAR2(255),
VERSION_ INTEGER DEFAULT 1,
PROJECT_RELEASE_VERSION_ NVARCHAR2(255),
primary key (ID_)
);
create table ACT_RE_MODEL (
ID_ NVARCHAR2(64) not null,
REV_ INTEGER,
NAME_ NVARCHAR2(255),
KEY_ NVARCHAR2(255),
CATEGORY_ NVARCHAR2(255),
CREATE_TIME_ TIMESTAMP(6),
LAST_UPDATE_TIME_ TIMESTAMP(6),
VERSION_ INTEGER,
META_INFO_ NVARCHAR2(2000),
DEPLOYMENT_ID_ NVARCHAR2(64),
EDITOR_SOURCE_VALUE_ID_ NVARCHAR2(64),
EDITOR_SOURCE_EXTRA_VALUE_ID_ NVARCHAR2(64),
TENANT_ID_ NVARCHAR2(255)