flowable使用druid支持自定义模式

本文介绍了如何在SpringBoot集成Flowable时,针对PostgreSQL和达梦数据库修改Druid的schema设置,包括修改DruidPooledConnection的setSchema方法,以及添加针对达梦数据库的判断。

flowable集成到spring boot之后,默认会使用给定的数据库名(mysql系列)或模式名(Oracle、PostgreSQL、达梦等)来创建相关的表结构,虽然flowable提供了可配置参数flowable.database-schema来使用其他模式。druid不支持修改schema的值。

Druid的1.2.4版本中虽然可以修改schema,但仅限于mysql,其他类型的数据库依然不支持修改。工作中需要支持PostgreSQL和达梦,只能通过修改druid的源码来实现。

方法一:

参考Apache的数据库连接池,将类DruidPooledConnection的setSchema方法修改如下

    public void setSchema(String schema) throws SQLException {
        try{
            conn.setSchema(schema);
            if (holder.statementPool != null) {
                holder.clearStatementCache();
            }
        } catch (SQLException sqlException) {
            throw new SQLFeatureNotSupportedException();
        }
    }

方法二:

参照Druid的方式,将类DruidPooledConnection的setSchema的方法修改如下:

    public void setSchema(String schema) throws SQLException {
        String dbType = holder.dataSource.getDbType();
        boolean hasSchema = JdbcUtils.isMysqlDbType(dbType)
                || JdbcUtils.isPgsqlDbType(dbType)
                || JdbcUtils.isOracleDbType(dbType)
                || JdbcUtils.isSqlserverDbType(dbType)
                || JdbcUtils.isDmDbType(dbType);
        if (hasSchema) {
            conn.setSchema(schema);
            if (holder.statementPool != null) {
                holder.clearStatementCache();
            }
        } else {
            throw new SQLFeatureNotSupportedException();
        }
    }

在JdbcUtils工具类中添加isDmDbType方法

    public static boolean isDmDbType(String dbTypeName) {
        return isDmDbType(DbType.of(dbTypeName));
    }

    public static boolean isDmDbType(DbType dbType) {
        if(null == dbType) {
            return false;
        }

        return dbType == DbType.dm;
    }

 

Flowable 中实现自定义表名生成策略,主要依赖于其内置的 `TablePrefixProvider` 接口,通过实现该接口并配置到流程引擎中,可以动态地修改数据库表名前缀。默认情况下,Flowable 使用 `ACT_` 作为表名前缀,例如 `ACT_RE_PROCDEF` 表示流程定义表。若需要更改该前缀(如改为 `FLW_`),需通过自定义逻辑实现并进行配置。 ### 实现方法 首先,需定义一个类实现 `TablePrefixProvider` 接口,并重写其方法。例如: ```java public class CustomTablePrefixProvider implements TablePrefixProvider { private final String prefix; public CustomTablePrefixProvider(String prefix) { this.prefix = prefix; } @Override public String getTablePrefix() { return prefix; } @Override public boolean isPrefixingTableNames() { return true; } } ``` 在该实现中,`getTablePrefix()` 方法返回自定义的表名前缀,`isPrefixingTableNames()` 返回 `true` 表示启用前缀功能。随后,在流程引擎初始化时设置该提供者: ```java ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault(); processEngineConfiguration.setTablePrefixProvider(new CustomTablePrefixProvider("FLW_")); ``` 通过这种方式,Flowable 在执行数据库操作时会自动将指定的前缀附加到所有表名前。此方法适用于运行时表(如 `ACT_RU_TASK`)、历史表(如 `ACT_HI_TASKINST`)和通用表(如 `ACT_GE_BYTEARRAY`)等所有类型的表名生成[^1]。 ### 注意事项 - 修改表名前缀后,必须同步更新数据库脚本,确保建表语句中的表名与代码中使用的前缀一致。 - 需要对 Flowable 的实体类和 MyBatis 映射文件中的硬编码表名进行调整,否则会导致运行时错误。 - 若使用Flowable 提供的 REST API 或 UI 模块(如 Modeler、Task、Admin 等),也需检查其数据库访问逻辑是否适配新前缀。 - 修改后需进行全面测试,包括流程部署、执行、任务处理等核心功能,确保数据库操作正常[^2]。 ### 相关问题 1. Flowable 6.8.0 支持哪些数据库?不同数据库的建表脚本有何差异? 2. 在 Spring Boot 中如何集成自定义表名前缀的 Flowable 引擎? 3. Flowable数据库表结构设计有哪些最佳实践? 4. 修改 Flowable 表名前缀后,如何进行数据库迁移和兼容性处理?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值