目前,flowable支持mysql、postgreSQL、DB2、Oracle等数据库,官方暂不支持国产数据库KingbaseES。因项目需要,尝试修改flowable 6.4支持KingbaseES V8,配置方法如下文。
1、数据配置
nexus私服仓库上传kingbaseES V8的jdbc驱动,同时配置pom文件
项目中配置数据库连接,因为项目使用的是spring boot,配置如下:
datasource:
driver-class-name:com.kingbase8.Driver
url:jdbc:kingbase8://127.0.0.1:54321/TEST
username:SYSTEM
password:111
2、工作流引擎初始化
工作流初始化的时候会加载数据库配置,会根据数据库类型,加载项目下的差异化sql脚本,具体流程:org.flowable.app.engine.AppEngineConfiguration中的init方法:
protected void init() {
initEngineConfigurations();
initConfigurators();
configuratorsBeforeInit();
initCommandContextFactory();
initTransactionContextFactory();
initCommandExecutors();
initIdGenerator();
initExpressionManager();
if (usingRelationalDatabase) {
initDataSource();
}
if (usingRelationalDatabase || usingSchemaMgmt) {
initSchemaManager();
initSchemaManagementCommand();
}
initVariableTypes();
initBeans();
initTransactionFactory();
if (usingRelationalDatabase) {
initSqlSessionFactory();
}
initSessionFactories();
initServices();
initDataManagers();
initEntityManagers();
initDeployers();
initAppDefinitionCache();
initAppResourceConverter();
initDeploymentManager();
initClock();
initIdentityLinkServiceConfiguration();
initVariableServiceConfiguration();
configuratorsAfterInit();
initBusinessCalendarManager();
}
其中initDataSource会初始化数据库类型,调用initDatabaseType,initDatabaseType中获取数据库类型的方式如下
databaseType = databaseTypeMappings.getProperty(databaseProductName);
databaseTypeMappings是一个定义的Properties,存储数据库类型的映射,之后在initSqlSessionFactory 中调用
properties.load(getResourceAsStream(pathToEngineDbProperties()));
public String pathToEngineDbProperties() {
return "org/flowable/common/db/properties/" + databaseType + ".properties";
}
会根据数据库的类型查找具体的配置文件,然后加载进initMybatisConfiguration的配置,而配置文件中的写的就是具体的分页方式,如下是mysql.properties文件的内容
limitAfter=LIMIT #{maxResults} OFFSET #{firstResult}
金仓的分页方式和mysql的一样,所以我们之后可以共用
3、更改代码适配金仓
如上分析我们只需要增加一个金仓的映射,并把映射的值设置为与mysql一致
在org.flowable.common.engine.impl.AbstractEngineConfiguration中添加如下代码
public static final String DATABASE_TYPE_KINGBASEES = "mysql";
在getDefaultDatabaseTypeMappings映射中添加
databaseTypeMappings.setProperty("KingbaseES", DATABASE_TYPE_KINGBASEES);