【实践】若依框架轻量化改造:从MySQL到SQLite3的迁移实战

张开发
2026/4/12 21:24:39 15 分钟阅读

分享文章

【实践】若依框架轻量化改造:从MySQL到SQLite3的迁移实战
1. 为什么选择SQLite3替代MySQL若依框架作为国内流行的快速开发平台默认采用MySQL作为数据库。但在某些特定场景下MySQL显得过于重量级比如开发演示环境、资源受限的嵌入式设备、快速原型验证等。这时候SQLite3的优势就凸显出来了零配置部署不需要安装数据库服务一个文件就是完整数据库单文件存储所有数据、表结构、索引都保存在单个.db文件中跨平台性强数据库文件可以在不同操作系统间直接拷贝使用资源占用低运行时内存消耗通常只有几百KB我在最近的一个物联网项目中就遇到了这种情况需要在树莓派上部署若依的管理后台但设备只有1GB内存。将MySQL换成SQLite3后内存占用直接减少了70%完美解决了资源瓶颈问题。2. 迁移前的准备工作2.1 环境检查清单开始迁移前建议先准备好以下环境JDK 1.8实测OpenJDK 17也能完美运行Maven 3.6避免使用旧版导致构建问题若依基础项目推荐4.7.5版本SQLite3命令行工具用于数据库初始化# 快速检查环境是否就绪 java -version mvn -v sqlite3 --version2.2 项目结构调整若依默认的多模块结构对SQLite3迁移不太友好建议先做精简保留ruoyi-admin核心模块移除ruoyi-quartz定时任务模块首次迁移时可暂不考虑清理不需要的MySQL驱动依赖注意如果项目已经深度定制建议先创建一个新的分支进行迁移实验3. 关键配置修改步骤3.1 数据库连接配置找到application-druid.yml文件主要修改三个关键配置spring: datasource: driver-class-name: org.sqlite.JDBC url: jdbc:sqlite:/path/to/ruoyi.db druid: validation-query: SELECT 1 FROM DUAL这里有个大坑需要注意SQLite的JDBC驱动在验证连接时必须存在DUAL表。解决方法是在初始化脚本中加入CREATE TABLE DUAL(test int); INSERT INTO DUAL VALUES(1);3.2 POM依赖调整在ruoyi-admin的pom.xml中替换MySQL依赖为SQLite3驱动dependency groupIdorg.xerial/groupId artifactIdsqlite-jdbc/artifactId version3.43.2.2/version /dependency建议使用3.36.0.1以上版本旧版存在日期解析问题。我在实际项目中就踩过这个坑系统日志里的时间全部变成乱码升级驱动后才解决。4. SQL脚本转换实战4.1 基础语法转换若依提供的SQL脚本需要做以下适配修改MySQL语法SQLite3等效写法AUTO_INCREMENTAUTOINCREMENTENGINEInnoDB直接删除DEFAULT NULL可省略COMMENT 注释-- 注释4.2 典型问题处理分页语句改造 若依的PageHelper插件需要特殊配置pagehelper: helper-dialect: sqlite日期函数替换 将所有sysdate()替换为CURRENT_TIMESTAMP我在迁移用户表时就因为漏改这个导致注册时间全部出错。索引语法调整-- MySQL写法 ALTER TABLE sys_user ADD INDEX idx_dept_id (dept_id); -- SQLite3写法 CREATE INDEX IF NOT EXISTS idx_dept_id ON sys_user(dept_id);5. MyBatis映射文件适配5.1 常见SQL差异处理若依的XML映射文件中需要特别注意这些MySQL特性LIMIT分页参数!-- 原MySQL写法 -- if testpageNum ! null and pageSize ! null LIMIT #{pageNum},#{pageSize} /if !-- SQLite3兼容写法 -- if testpageNum ! null and pageSize ! null LIMIT #{pageSize} OFFSET #{pageNum} /ifON DUPLICATE KEY UPDATE替换-- 使用SQLite的INSERT OR REPLACE语法 INSERT OR REPLACE INTO sys_config (...) VALUES (...)5.2 批量插入优化MySQL的批量插入语法INSERT INTO table VALUES (1),(2),(3);SQLite3需要改为INSERT INTO table VALUES (1); INSERT INTO table VALUES (2); INSERT INTO table VALUES (3);我在迁移菜单数据时就遇到这个问题最后写了个Python脚本自动转换插入语句。6. 迁移后的验证与调试6.1 常见错误排查日期格式问题 如果遇到Unparseable date错误检查驱动版本是否≥3.36.0.1并在连接URL添加参数jdbc:sqlite:test.db?date_string_formatyyyy-MM-dd HH:mm:ss事务锁定问题 SQLite的写操作会锁定整个数据库建议调整若依的批量操作逻辑改为小批量多次提交。6.2 性能调优建议启用WAL模式提升并发PRAGMA journal_modeWAL;调整缓存大小PRAGMA cache_size-2000; -- 2MB缓存定期执行VACUUM命令整理数据库碎片7. 生产环境注意事项虽然SQLite3很轻量但在生产环境使用时仍需注意备份策略SQLite没有网络服务需要自行实现.db文件备份并发限制写操作是串行的高并发场景要考虑队列机制数据迁移后期如果需要切回MySQL可以使用.dump命令导出SQL我在一个边缘计算项目中就采用了每日定时压缩备份.db文件的方案用简单的crontab任务就实现了数据安全# 每天凌晨备份 0 0 * * * sqlite3 /app/ruoyi.db .backup /backups/ruoyi_$(date %Y%m%d).db这种轻量化改造后的若依框架特别适合作为演示系统、内网工具或资源受限环境的管理后台。整个迁移过程最耗时的其实是SQL语法转换环节建议先在小规模测试库上验证所有功能再正式切换。

更多文章