flowable适配国产开源数据库TiDB

近期因项目需要,要适配flowable到国产数据库TiDB,将碰到的问题做个记录,虽然问题暂时解决了,但不是最优解,如有更好的配置方法,烦请指教!

版本

flowable:6.4.2版本

tidb:7.5版本

问题描述

由于tidb完全兼容mysql,所以系统连接和mysql一致,本来以为不用做任何修改,将mysql导入到tidb后本地windows环境直接启动系统发现正常,但部署到linux服务器后无法正常启动,报如下错误:

FlowableWrongDbException: version mismatch: library version is ‘6.5.0.1‘, db version is 5.99.0.0 

解决思路

由于这个错在以前连接mysql时碰到过,当时的原因是mysql大小写敏感问题导致的,需要配置lower_case_table_names参数,所以这边猜测也是这个原因,于是看了tidb官方文档,描述如下:

tidb对lower_case_table_names 参数为2的描述是 :

表名存储为给定的大小写但是比较的时候是小写的。

参考:TiDB 产品文档 | PingCAP 文档中心

这边尝试将lower_case_table_names参数的值设置成1,没报错,但还是没效果,没办法,这边只能调试flowable源码,最后发现是 isTablePresent 这个方法没有找不到表名:

    public boolean isTablePresent(String tableName) {
        // ACT-1610: in case the prefix IS the schema itself, we don't add the
        // prefix, since the check is already aware of the schema
        DbSqlSession dbSqlSession = getDbSqlSession();
        DbSqlSessionFactory dbSqlSessionFactory = dbSqlSession.getDbSqlSessionFactory();
        if (!dbSqlSession.getDbSqlSessionFactory().isTablePrefixIsSchema()) {
            tableName = prependDatabaseTablePrefix(tableName);
        }

        Connection connection = null;
        try {
            connection = dbSqlSession.getSqlSession().getConnection();
            DatabaseMetaData databaseMetaData = connection.getMetaData();
            ResultSet tables = null;

            String catalog = dbSqlSession.getConnectionMetadataDefaultCatalog();
            if (dbSqlSessionFactory.getDatabaseCatalog() != null && dbSqlSessionFactory.getDatabaseCatalog().length() > 0) {
                catalog = dbSqlSessionFactory.getDatabaseCatalog();
            }

            String schema = dbSqlSession.getConnectionMetadataDefaultSchema();
            if (dbSqlSessionFactory.getDatabaseSchema() != null && dbSqlSessionFactory.getDatabaseSchema().length() > 0) {
                schema = dbSqlSessionFactory.getDatabaseSchema();
            } else if (dbSqlSessionFactory.isTablePrefixIsSchema() && StringUtils.isNotEmpty(dbSqlSessionFactory.getDatabaseTablePrefix())) {
                schema = dbSqlSessionFactory.getDatabaseTablePrefix();
                if (StringUtils.isNotEmpty(schema) && schema.endsWith(".")) {
                    schema = schema.substring(0, schema.length() - 1);
                }
            }

            String databaseType = dbSqlSessionFactory.getDatabaseType();

            if ("postgres".equals(databaseType)) {
                tableName = tableName.toLowerCase();
            } else if ("cockroachdb".equals(databaseType)) {
                tableName = tableName.toLowerCase(); // same as postgres
                schema = "public"; // CRDB only supports public right now
            }

            if (schema != null && "oracle".equals(databaseType)) {
                schema = schema.toUpperCase();
            }

            if (catalog != null && catalog.length() == 0) {
                catalog = null;
            }

            try {
                //分别在控制台打印出catalog, schema, tableName的值
//                System.out.println("catalog: " + catalog);
//                System.out.println("schema: " + schema);
//                System.out.println("tableName: " + tableName);
                tables = databaseMetaData.getTables(catalog, schema, tableName, JDBC_METADATA_TABLE_TYPES);
                return tables.next();
            } finally {
                try {
                    if (tables != null) {
                        tables.close();
                    }
                } catch (Exception e) {
                    logger.error("Error closing meta data tables", e);
                }
            }

        } catch (Exception e) {
            throw new FlowableException("couldn't check if tables are already present using metadata: " + e.getMessage(), e);
        }
    }

以上方法是flowable检查是否存在物理表的方法,最终定位到是以下方法没有获取到表名:

这边增加日志后,打印输出如下:

flowable对以上3张表做了验证,并且验证后直接报错。

由于这几张物理表建表时是用的小写,我怀疑可能是这的问题,于是这边把act_de_property,act_id_property,act_hi_procinst,act_ru_execution这几张表删除后用大写的表名重建后再重启服务发现正常。

总结

tidb官网说明是 lower_case_table_names 不区分windows和linux,但实际还是有区别,我理解是windows下默认还是大小写不敏感,但linux下还是大小写敏感导致的,不然也不会出现本地windows环境正常,而部署到linux无法启动。

如有其他解决办法,欢迎留言!

  • 30
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
flowable是一个开源的工作流引擎,它基于BPMN 2.0标准,并提供了实现业务流程的功能。达梦数据库是一种国产数据库管理系统。那么如何将flowable适配达梦数据库呢? 首先,通过flowable数据库适配器功能,我们可以将flowable连接到达梦数据库flowable支持自定义数据库配置,可以通过更改配置文件来指定达梦数据库的连接信息,包括数据库类型、地址、用户名和密码等。通过修改相应的配置,我们可以确保flowable能够正确地连接到达梦数据库。 其次,flowable使用了标准的JDBC接口与数据库进行交互。因此,只要达梦数据库提供了JDBC驱动程序,flowable就可以通过该驱动程序与达梦数据库进行通信。可以从达梦官方网站下载并安装达梦数据库的JDBC驱动程序,并将其配置为flowable所需的驱动程序。 最后,我们还需要确保达梦数据库flowable数据库结构兼容。在flowable的环境下,数据库中会创建一系列的表和视图来存储流程定义、流程实例、任务、历史记录等信息。我们需要确保这些表和视图在达梦数据库中正确创建,并具有适当的字段和关系。 总结来说,要使flowable适配达梦数据库,我们需要: 1. 修改flowable数据库配置,以连接到达梦数据库。 2. 安装达梦数据库的JDBC驱动程序,并配置给flowable使用。 3. 确保达梦数据库flowable数据库结构兼容。 通过以上的适配工作,我们可以成功地将flowable与达梦数据库进行整合,实现业务流程的管理和执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值