diff --git a/README.md b/README.md index c12b4f4..a1e3f57 100644 --- a/README.md +++ b/README.md @@ -67,12 +67,12 @@ |----------|-----------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| | 国产操作系统 | 银河麒麟、统信 UOS 等 Linux 系统 | 参考 [《Linux 部署》](https://doc.iocoder.cn/deployment-linux/),选择与 CPU 架构匹配的 JDK | | 关系型数据库 | MySQL、MariaDB、Oracle、PostgreSQL、SQL Server | 默认使用 MySQL | -| 国产关系型数据库 | 达梦 DM、人大金仓 KingbaseES、openGauss、瀚高 HighGo、OceanBase、TiDB、华为 GaussDB、云和恩墨 MogDB、海量 Vastbase G100、PolarDB、神通 | 参考 [《国产信创数据库》](https://doc.iocoder.cn/xinchuang-db/)。GaussDB、MogDB、Vastbase G100 使用 PG 兼容模式;神通已支持普通 CRUD、代码生成,详见 [神通数据库](https://doc.iocoder.cn/xinchuang-db/#_9-神通数据库) | -| 国产缓存 | 东方通 TongRDS、宝兰德 BES CacheDB | 替换 Redis,参考 [《国产信创数据库》](https://doc.iocoder.cn/xinchuang-db/)。BES CacheDB 提供接入说明,待介质验证 | -| 国产应用服务器 | 东方通 TongWeb、宝兰德 BES AppServer | 替换 Tomcat,参考 [《东方通服务器部署》](https://doc.iocoder.cn/deployment-tong/)、[《宝兰德服务器部署》](https://doc.iocoder.cn/deployment-bes/)。BES AppServer 提供接入说明,待介质验证 | +| 国产关系型数据库 | 达梦 DM、人大金仓 KingbaseES、openGauss、瀚高 HighGo、OceanBase、TiDB、华为 GaussDB、云和恩墨 MogDB、海量 Vastbase G100、PolarDB、神通 | 参考 [《国产信创数据库》](https://doc.iocoder.cn/xinchuang-db/) | +| 国产缓存 | 东方通 TongRDS、宝兰德 BES CacheDB | 替换 Redis,参考 [《国产信创数据库》](https://doc.iocoder.cn/xinchuang-db/) | +| 国产应用服务器 | 东方通 TongWeb、宝兰德 BES AppServer | 替换 Tomcat,参考 [《东方通服务器部署》](https://doc.iocoder.cn/deployment-tong/)、[《宝兰德服务器部署》](https://doc.iocoder.cn/deployment-bes/) | | 国产 Web 服务器 | 东方通 TongHttpServer | 替换 Nginx,提供静态资源、反向代理,参考 [《东方通服务器部署》](https://doc.iocoder.cn/deployment-tong/) | -* 数据库脚本:[`sql`](sql/) 目录提供 MySQL、Oracle、PostgreSQL、SQL Server、达梦、人大金仓、openGauss、瀚高、OceanBase 的项目初始化脚本(含 Quartz),优先使用对应目录;MariaDB、TiDB 直接使用 MySQL 脚本;GaussDB、MogDB、Vastbase G100 基于 openGauss 脚本导入,PolarDB PostgreSQL 版直接使用 PostgreSQL 脚本;神通需按 [文档](https://doc.iocoder.cn/xinchuang-db/#_9-神通数据库) 调整 openGauss 项目脚本后导入 +* 数据库脚本:[`sql`](sql/) 目录提供 MySQL、Oracle、PostgreSQL、SQL Server、达梦、人大金仓、openGauss、瀚高、OceanBase 的项目初始化脚本(含 Quartz),优先使用对应目录;MariaDB、TiDB 直接使用 MySQL 脚本;GaussDB、MogDB、Vastbase G100 基于 openGauss 脚本导入,PolarDB PostgreSQL 版直接使用 PostgreSQL 脚本;神通需按 [文档](https://doc.iocoder.cn/xinchuang-db/#_9-神通数据库) 调整 openGauss 项目脚本(含 Quartz)后导入 * 其它数据库、后续表结构变更,可参考 [`sql/tools`](sql/tools/README.md) 的转换工具及 [《表结构变更(版本升级)》](https://doc.iocoder.cn/sql-update/#_3-数据库转换),转换后仍需按实际数据库调整、测试 ## 🐳 项目关系 diff --git a/sql/tools/README.md b/sql/tools/README.md index 5cf7f09..f2bf936 100644 --- a/sql/tools/README.md +++ b/sql/tools/README.md @@ -235,7 +235,13 @@ sed -e '/^-- Table structure for dual$/,/^-- @formatter:on$/d' -e 's/varchar(102 ALTER TABLE system_menu ALTER COLUMN id SET DEFAULT nextval('system_menu_seq'); ``` -> 注意:神通暂未适配 Quartz,不需要导入 `sql/opengauss/quartz.sql`;`application-local.yaml` 默认排除了 Quartz 的自动配置,保持不变即可。 +如需使用 Quartz 定时任务,再以该账号执行 Quartz 的临时脚本:只将 `bytea` 字段改为神通的 `BLOB`(`bytea` 字段在神通上无法读取任务数据),其余 SQL 保持不变: + +```Bash +sed 's/ bytea / BLOB /' ../opengauss/quartz.sql > /tmp/quartz-shentong.sql +``` + +> 注意:该 Quartz 脚本用于全新初始化,不支持把已有数据的 `bytea` 字段转换为 `BLOB`。Quartz 使用默认的 `StdJDBCDelegate`,不需要设置 `driverDelegateClass`,也不要开启 `useProperties`(任务参数包含 `Long` 等非字符串类型)。`application-local.yaml` 默认排除了 Quartz 的自动配置,需要使用时,从 `spring.autoconfigure.exclude` 列表中删除 `QuartzAutoConfiguration` 这一行即可;不要通过启动参数单独设置 `spring.autoconfigure.exclude`,否则会覆盖整个排除列表。 ② 项目使用神通 JDBC 驱动(`com.oscar.Driver`),使用序列主键(复用 MyBatis Plus 的 `PostgreKeyGenerator`),分页使用 MyBatis Plus 内置的神通方言。将数据源配置中的地址、账号和密码修改为: @@ -257,6 +263,8 @@ password: 神通密码 > 注意:该驱动是 Maven 中央仓库上 `com.shentongdata` 发布的版本,不是神通官方下载中心的配套认证版本。项目适配时使用的是神通 7.0.14,其它版本请自行验证。 +③ 工作流:神通驱动返回的数据库产品名为 `OSCAR`,Flowable 无法自动识别,项目会在未设置 `flowable.database-type` 时,将其按 `oracle` 处理(使用 Flowable 内置的 Oracle 建表脚本,`BLOB`、`CLOB` 字段及大写的表名)。启用 BPM 模块后,Flowable 按默认的 `flowable.database-schema-update: true` 自动创建 Flowable 引擎的 `ACT_`、`FLW_` 表;BPM 模块的 `bpm_` 业务表不会自动创建,需要先按 [《工作流 · 功能开启》](https://doc.iocoder.cn/bpm/) 获取 BPM 的 SQL,转换为神通可以执行的 SQL(包括 `bpm_` 表对应的序列)后导入。如果显式设置了 `flowable.database-type`,以显式设置为准,神通需要设置为 `oracle`,不要设置为 `postgres`。 + ## 1.X 容器的销毁重建 开发测试过程中,有时候需要创建全新干净的数据库。由于测试数据 Docker 容器采用数据卷 Volume 挂载数据库实例的数据目录,因此销毁数据需要停止容器后,删除数据卷,然后再重新创建容器。 diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java index 0559ab9..3325c87 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java @@ -60,7 +60,7 @@ public class BpmFlowableConfiguration { * * 1. 设置各种监听器 * 2. 设置自定义的 ActivityBehaviorFactory 实现 - * 3. 设置华为 GaussDB、openGauss(含 MogDB)的数据库类型 + * 3. 设置华为 GaussDB、openGauss(含 MogDB)、神通的数据库类型 */ @Bean public EngineConfigurationConfigurer bpmProcessEngineConfigurationConfigurer( @@ -74,33 +74,38 @@ public class BpmFlowableConfiguration { configuration.setActivityBehaviorFactory(bpmActivityBehaviorFactory); // 设置自定义的函数 configuration.setCustomFlowableFunctionDelegates(ListUtil.toList(customFlowableFunctionDelegates.stream().iterator())); - // 设置华为 GaussDB、openGauss(含 MogDB)的数据库类型 - initPostgreSQLCompatibleDatabaseType(configuration); + // 设置华为 GaussDB、openGauss(含 MogDB)、神通的数据库类型 + initDatabaseType(configuration); }; } /** - * 以下原生驱动返回的 ProductName 不是 PostgreSQL,Flowable 无法识别,启动时会报错: + * 以下原生驱动返回的 ProductName,Flowable 无法识别,启动时会报错: * 1. 华为 GaussDB 的原生驱动(jdbc:gaussdb:),返回 GaussDB * 2. org.opengauss 的 openGauss JDBC 驱动(jdbc:opengauss:),返回 openGauss,连接 MogDB 时也是如此 + * 3. 神通的 JDBC 驱动(jdbc:oscar:),返回 OSCAR * - * 因此,在未显式设置 databaseType 时,按 PostgreSQL 处理(需要使用 PG 兼容模式创建的数据库)。 + * 因此,在未显式设置 databaseType 时:GaussDB、openGauss 按 PostgreSQL 处理(需要使用 PG 兼容模式创建的数据库); + * 神通按 Oracle 处理,使用 BLOB、CLOB 字段及大写的表名。 * 只读取 Flowable 自身数据源的元数据,其它数据库不做处理,仍由 Flowable 自动识别 * * @param configuration Flowable 配置 */ - private static void initPostgreSQLCompatibleDatabaseType(SpringProcessEngineConfiguration configuration) { + private static void initDatabaseType(SpringProcessEngineConfiguration configuration) { if (configuration.getDatabaseType() != null || configuration.getDataSource() == null) { return; } try (Connection connection = configuration.getDataSource().getConnection()) { - if (ObjectUtils.equalsAny(connection.getMetaData().getDatabaseProductName(), + String productName = connection.getMetaData().getDatabaseProductName(); + if (ObjectUtils.equalsAny(productName, DbTypeEnum.GAUSS_DB.getProductName(), DbTypeEnum.OPENGAUSS.getProductName())) { configuration.setDatabaseType(AbstractEngineConfiguration.DATABASE_TYPE_POSTGRES); + } else if (DbTypeEnum.OSCAR.getProductName().equals(productName)) { + configuration.setDatabaseType(AbstractEngineConfiguration.DATABASE_TYPE_ORACLE); } } catch (SQLException ex) { // 获取失败时,不做处理,由 Flowable 自动识别时报错 - log.warn("[initPostgreSQLCompatibleDatabaseType][获取数据库类型失败]", ex); + log.warn("[initDatabaseType][获取数据库类型失败]", ex); } } diff --git a/yudao-module-bpm/src/test/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfigurationTest.java b/yudao-module-bpm/src/test/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfigurationTest.java index 1140da8..c772b8f 100644 --- a/yudao-module-bpm/src/test/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfigurationTest.java +++ b/yudao-module-bpm/src/test/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfigurationTest.java @@ -73,6 +73,21 @@ public class BpmFlowableConfigurationTest extends BaseMockitoUnitTest { } @Test + public void testBpmProcessEngineConfigurationConfigurer_oscar() throws SQLException { + // mock 方法:神通 JDBC 驱动(jdbc:oscar:)返回的 ProductName + mockDatabaseProductName("OSCAR"); + // 准备参数 + SpringProcessEngineConfiguration configuration = buildConfiguration(null); + + // 调用 + configure(configuration); + + // 断言:按 Oracle 处理,并关闭连接 + assertEquals(AbstractEngineConfiguration.DATABASE_TYPE_ORACLE, configuration.getDatabaseType()); + verify(connection).close(); + } + + @Test public void testBpmProcessEngineConfigurationConfigurer_postgreSQL() throws SQLException { // mock 方法:PostgreSQL,以及 io.mogdb 的 openGauss JDBC 驱动连接 MogDB 时返回的 ProductName mockDatabaseProductName("PostgreSQL");