name: oracle-to-goldendb-migration description: Migrate Java web projects from Oracle database to GoldenDB (国产化数据库). Handles JDBC driver replacement, SQL syntax conversion (sysdate, to_char, decode, rownum, sequences, dual), connection pool reconfiguration, and model/DAO layer adaptation. Use when migrating Oracle-based projects to GoldenDB or when performing database localization/国产化 tasks.
Oracle → GoldenDB 数据库迁移
概述
本 Skill 专门用于将基于 AICF 框架 + Struts 2 + DBCP 连接池的 Java Web 项目从 Oracle 数据库迁移到 GoldenDB(中兴分布式数据库,MySQL 协议兼容)。
迁移总览
完整的 Oracle → GoldenDB 迁移包含以下 7 个阶段:
迁移进度:
- [ ] 阶段 1:替换 JDBC 驱动 JAR 包
- [ ] 阶段 2:修改数据库连接配置(apps.properties)
- [ ] 阶段 3:修改硬编码 JDBC 连接代码
- [ ] 阶段 4:转换 Oracle 特有 SQL 函数/语法
- [ ] 阶段 5:处理序列/自增主键(func_sc_getseq)
- [ ] 阶段 6:修改连接池验证查询
- [ ] 阶段 7:模型层/DAO 适配调整
阶段 1:替换 JDBC 驱动 JAR 包
操作:
-
从
WEB-INF/lib/中移除 Oracle JDBC 驱动(通常名为ojdbc*.jar) -
将 GoldenDB JDBC 驱动 JAR 放入
WEB-INF/lib/
GoldenDB JDBC 驱动获取:
-
GoldenDB 通常兼容 MySQL 协议,可使用 MySQL Connector/J(
mysql-connector-java-8.x.jar) -
或使用中兴官方提供的 GoldenDB 专用 JDBC 驱动
阶段 2:修改数据库连接配置
修改前(Oracle):
修改后(GoldenDB / MySQL 协议):
GoldenDB 原生驱动(如有专用驱动):
注意:具体驱动类名和 URL 格式请以 GoldenDB 官方文档为准。如果 GoldenDB 提供的是 MySQL 兼容模式,则使用 MySQL Connector/J 驱动即可。
阶段 3:修改硬编码 JDBC 连接
需要修改的文件清单:
修改模板:
阶段 4:转换 Oracle 特有 SQL 语法
详细的 SQL 对照表见 [sql-conversion-reference.md](file:/D:/Code/guizhou/admp_gz/admp/.qoder/skills/oracle-to-goldendb-migration/sql-conversion-reference.md)。
核心转换规则速查:
| Oracle 语法 | GoldenDB / MySQL 等价 | 影响文件数 |
|---|---|---|
sysdate |
NOW() 或 CURRENT_TIMESTAMP |
15+ |
to_char(date, 'yyyy-MM-dd') |
DATE_FORMAT(date, '%Y-%m-%d') |
25+ |
to_date(str, 'yyyy-MM-dd hh24:mi:ss') |
STR_TO_DATE(str, '%Y-%m-%d %H:%i:%s') |
25+ |
decode(expr, search, result, default) |
CASE WHEN expr = search THEN result ELSE default END |
2-3 |
rownum < N |
LIMIT N |
2 |
select 1 from dual |
SELECT 1 |
1 |
nvl(expr, default) |
IFNULL(expr, default) 或 COALESCE(expr, default) |
若干 |
trunc(date) |
DATE(date) |
若干 |
| `str1 \ | \ | str2` |
日期格式映射对照:
| Oracle 格式 | MySQL/GoldenDB 格式 |
|---|---|
yyyy |
%Y |
yy |
%y |
MM |
%m |
dd |
%d |
hh24 |
%H |
mi |
%i |
ss |
%s |
day |
%W |
yyyymm |
%Y%m |
yyyymmdd |
%Y%m%d |
yyyy-MM-dd hh24:mi:ss |
%Y-%m-%d %H:%i:%s |
文件级修改示例:
// 修改前
sql = "select to_char(sysdate, 'day') xinqi,"
+ " to_char(sysdate + 1, 'yyyymm') nextdayM,"
+ " to_char(sysdate, 'yyyymm') todayM"
+ " from dual";
// 修改后
sql = "select DATE_FORMAT(NOW(), '%W') xinqi,"
+ " DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 DAY), '%Y%m') nextdayM,"
+ " DATE_FORMAT(NOW(), '%Y%m') todayM";
// 修改前
" decode(aa.flag, '未超时', aa.num, 0) type1,"
+ " decode(aa.flag, '超时', aa.num, 0) type2"
// 修改后
" CASE WHEN aa.flag = '未超时' THEN aa.num ELSE 0 END type1,"
+ " CASE WHEN aa.flag = '超时' THEN aa.num ELSE 0 END type2"
sysdate → NOW():
// 修改前: "when j.finish_date > sysdate"
// 修改后: "when j.finish_date > NOW()"
阶段 5:处理序列/自增主键
当前 Oracle 序列模式
项目中使用了自定义函数 func_sc_getseq('表名') 来获取序列值,分布在以下文件:
| 文件 | 行号 | 表名 |
|---|---|---|
EvalUtils.java |
81 | sm_cosmic_inte_eval_logs |
BusiSMSContextCheckAction.java |
120 | sm_active_log |
DemaActiveLogAction.java |
50 | sm_active_log |
GroupBackBusinessAction.java |
1095 | sm_group_logs |
GroupBusinessAction.java |
1287 | sm_group_logs |
PanZhouBusinessAction.java |
492 | sm_panzhou_log |
FPADMPAnasToDevelopImpl.java |
885 | sm_active_log |
SPBeanBuilder.java |
189, 205 | SP_BEAN, SP_BEAN_FIELD |
GoldenDB 自增主键策略
方案 A(推荐):数据库层面使用 AUTO_INCREMENT
方案 B:Java 层面生成 ID(UUID 或雪花算法)
如果不想改表结构,可以在 Java 层生成唯一 ID:
// 修改前
// values(func_sc_getseq('sm_active_log'), ...)
// 修改后(使用雪花算法)
import cn.hutool.core.util.IdUtil;
String id = IdUtil.getSnowflakeNextIdStr();
String sql = "insert into sm_active_log (id, job_id, ...) values('" + id + "', ...)";
阶段 6:修改连接池验证查询
文件:src/apps.properties
阶段 7:模型层/DAO 适配调整
AICF 框架注意事项
本项目使用 AICF 自定义框架,Model 类继承 AICFAbstractTableBean。DAO 配置通过属性文件指定。需要检查
-
检查此 XML(位于
asiainfo-aicf-2.0.1.jar内部)是否包含 Oracle 特有 SQL,如有则需通过覆盖方式适配。 -
Model 类 不需要修改 Java 代码(因为通过 AICF 框架映射),但需要确保 GoldenDB 中表结构与 Model 字段对应(特别是数据类型映射)。
Oracle → GoldenDB 数据类型映射
| Oracle 类型 | GoldenDB/MySQL 类型 |
|---|---|
NUMBER |
BIGINT / DECIMAL / INT |
VARCHAR2(n) |
VARCHAR(n) |
CLOB |
LONGTEXT 或 TEXT |
DATE |
DATETIME 或 TIMESTAMP |
BLOB |
LONGBLOB |
CHAR(n) |
CHAR(n) |
LONG |
LONGTEXT |
迁移后验证
完成迁移后,执行以下验证:
-
应用启动无 JDBC 驱动加载异常
-
数据库连接池正常初始化
-
登录功能正常
-
核心列表页面数据能正常展示
-
日期查询、排序功能正常
-
数据新增(INSERT)功能正常,ID 自增正确
-
数据更新(UPDATE)功能正常
-
附件上传/下载功能正常
-
定时任务(Quartz)连接正常
-
报表统计 SQL 结果正确
附加资源
-
完整 SQL 转换对照:见 [sql-conversion-reference.md](file:/D:/Code/guizhou/admp_gz/admp/.qoder/skills/oracle-to-goldendb-migration/sql-conversion-reference.md)
-
迁移检查清单:见 [migration-checklist.md](file:/D:/Code/guizhou/admp_gz/admp/.qoder/skills/oracle-to-goldendb-migration/migration-checklist.md)