Spring Boot 项目从 SQLite 迁移 GaussDB 的踩坑记录
项目管理系统的数据层原本使用 SQLite,随着并发写入增多和部署环境变化,决定迁移到华为 GaussDB(兼容 PostgreSQL 协议)。连接本身只花了半天,真正花时间的是迁移后的三个问题。
问题一:schema 不一致
原项目 JPA 的 ddl-auto 设为 none,旧库里有一批历史遗留表,部分表缺少新版本必需的列(例如 app_key)。迁过去之后第一次查询直接报列不存在。
做法是先用 schema 比对脚本生成差异清单,在维护窗口内执行补齐 DDL,并把 ddl-auto 显式固定为 none——结构变更只走 DDL 脚本,不再依赖环境间的自动同步。
问题二:LazyInitializationException
Project 实体上的关联集合是懒加载,之前的代码在事务已经结束后才调用 ProjectResponse.from() 做对象转换,Session 早已关闭,迁移后这类问题集中爆发。
解决方案有两条,按场景选:只读列表在查询时一次性 join fetch;写入场景把对象转换收进事务边界内。同时明确一条纪律:禁止在 Service 边界之外访问懒加载属性。
问题三:约束冲突的错误表现不同
Topic Library 的 code 字段上有唯一约束,重复插入时 SQLite 和 GaussDB 抛出的错误完全不同,原先按 SQLite 错误码写的分支逻辑直接失效。
最终改为在代码层做前置校验:插入前先查重,数据库约束只当兜底。这样错误处理逻辑不再依赖具体数据库的错误码,可移植性也更好。
配置简化
迁移后不再手写完整 JDBC URL,配置只保留连接三要素:
spring:
datasource:
host: 192.168.31.253
username: apphub
password: ${DB_PASSWORD}
结论:数据库迁移的难点从来不是连上,而是旧账——结构差异、事务边界、约束行为,每一项都要在切换前逐项对齐,没有捷径。