code-adjust-record-2025-01-27-sql-cache-export-config.md 7.9 KB

SQL缓存导出配置功能开发记录

🔧 变更信息

  • 变更日期: 2025-01-27 20:30:00
  • 变更类型: 功能新增
  • 变更范围: 导出功能增强 + SQL缓存转换机制
  • 影响模块: 通用Excel导出功能 + 学工管理导出

🎯 开发目标

需求背景

用户希望在导出Excel时,能够配置SQL语句来加载数据到缓存进行匹配,实现更灵活的数据转换功能。

核心需求

  1. SQL配置化:支持通过SQL语句查询数据
  2. 缓存机制:将SQL查询结果缓存到内存
  3. 字段映射:支持值字段和标签字段的映射
  4. 高性能:避免重复数据库查询
  5. 易用性:简单的注解配置即可使用

💡 技术方案

1. 核心组件设计

1.1 注解定义

文件: backend/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelSqlCacheFormat.java

功能特性:

  • sqlKey:SQL缓存键,用于标识不同的SQL查询配置
  • sql:SQL查询语句,支持动态SQL
  • valueColumn:值字段名(用于匹配的字段)
  • labelColumn:标签字段名(用于显示的字段)
  • separator:分隔符,支持多值分隔

1.2 转换器实现

文件: backend/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelSqlCacheConvert.java

核心特性:

  • 静态缓存:使用ConcurrentHashMap存储SQL查询结果
  • 预加载机制:支持批量预加载SQL数据
  • 双向转换:支持值到标签和标签到值的转换
  • 线程安全:支持多用户并发导出
  • 错误处理:完善的异常处理和降级策略

1.3 配置服务

文件: backend/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/service/SqlCacheConfigService.java

功能特性:

  • 配置管理:统一的SQL配置注册和管理
  • SQL执行:使用JdbcTemplate执行SQL查询
  • 缓存操作:提供缓存预加载、清理、统计功能
  • 配置查询:支持查询和获取SQL配置信息

1.4 配置初始化器

文件: backend/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/config/SqlCacheConfigInitializer.java

功能特性:

  • 自动初始化:应用启动时自动注册SQL配置
  • 默认配置:提供常用的SQL配置示例
  • 扩展性:支持自定义配置注册

2. 使用示例

2.1 VO类配置

@Data
@ExcelIgnoreUnannotated
public class XgStudentMsgExportVo implements Serializable {
    
    /**
     * 班级名称 - 使用SQL缓存转换
     */
    @ExcelProperty(value = "班级名称", converter = ExcelSqlCacheConvert.class)
    @ExcelSqlCacheFormat(
        sqlKey = "student_class_info",  // 对应注册的SQL键
        valueColumn = "id",             // 值字段名
        labelColumn = "name"            // 标签字段名
    )
    private String className;
}

2.2 Controller配置

@RestController
public class XgStudentMsgController extends BaseController {
    
    /**
     * 预加载导出所需的SQL缓存数据
     */
    private void preloadExportSqlData() {
        try {
            SqlCacheConfigService sqlCacheConfigService = SpringUtils.getBean(SqlCacheConfigService.class);
            
            // 预加载SQL配置
            sqlCacheConfigService.preloadSqlData("student_class_info");
            sqlCacheConfigService.preloadSqlData("college_info");
            
            log.info("SQL缓存预加载完成");
        } catch (Exception e) {
            log.warn("SQL缓存预加载失败,将使用默认处理方式", e);
        }
    }
}

2.3 SQL配置示例

// 班级信息查询
"student_class_info" -> "SELECT class_id as id, class_name as name FROM xg_class WHERE deleted = 0"

// 学院信息查询
"college_info" -> "SELECT college_id as id, college_name as name FROM xg_college WHERE deleted = 0"

// 复杂关联查询
"class_with_teacher" -> """
    SELECT c.class_id as id, 
           CONCAT(c.class_name, ' (', u.nick_name, ')') as name 
    FROM xg_class c 
    LEFT JOIN sys_user u ON c.class_teacher_id = u.user_id 
    WHERE c.deleted = 0
"""

📊 性能优化

1. 缓存策略

  • 预加载机制:导出前批量加载所有SQL数据
  • 静态缓存:使用ConcurrentHashMap避免重复查询
  • 内存优化:合理控制缓存数据量

2. 数据库优化

  • 索引优化:确保查询字段有合适的索引
  • 查询优化:避免复杂的关联查询
  • 数据量控制:限制单次查询的数据量

3. 并发处理

  • 线程安全:使用ConcurrentHashMap保证线程安全
  • 缓存共享:多用户共享缓存数据
  • 资源管理:合理管理内存和数据库连接

🔄 与现有功能对比

1. 与字典转换的对比

特性 字典转换 SQL缓存转换
数据源 字典表 任意表
配置方式 字典类型 SQL语句
灵活性 固定格式 高度灵活
性能 预加载缓存 预加载缓存
适用场景 标准字典 复杂业务数据

2. 使用场景

  • 字典转换:适用于标准的字典数据(性别、状态等)
  • SQL缓存转换:适用于复杂的业务数据(班级、学院、专业等)

📝 实施步骤

1. 创建核心组件

  • ✅ 创建ExcelSqlCacheFormat注解
  • ✅ 创建ExcelSqlCacheConvert转换器
  • ✅ 创建SqlCacheConfigService配置服务
  • ✅ 创建SqlCacheConfigInitializer初始化器

2. 集成到现有系统

  • ✅ 修改学生信息导出VO,添加SQL缓存示例
  • ✅ 修改导出Controller,添加SQL缓存预加载
  • ✅ 添加必要的导入语句

3. 文档和测试

  • ✅ 创建使用指南文档
  • ✅ 创建变更记录文档
  • ✅ 提供配置示例和最佳实践

🧪 测试验证

测试场景

  1. 基础功能测试:验证SQL缓存转换的基本功能
  2. 性能测试:验证缓存机制的性能提升
  3. 并发测试:验证多用户并发导出的稳定性
  4. 错误处理测试:验证异常情况的处理

验证指标

  • ✅ 功能正确性:SQL转换结果正确
  • ✅ 性能提升:导出时间明显减少
  • ✅ 内存使用:缓存占用合理
  • ✅ 并发安全:多线程导出正常

⚠️ 注意事项

1. SQL安全

  • 参数化查询:避免SQL注入风险
  • 权限控制:确保SQL查询权限合理
  • 数据验证:验证SQL查询结果的正确性

2. 缓存管理

  • 内存使用:监控缓存占用的内存
  • 缓存更新:数据变更时及时清理缓存
  • 缓存失效:设置合理的缓存过期策略

3. 错误处理

  • 异常捕获:妥善处理SQL执行异常
  • 降级策略:SQL失败时的降级处理
  • 日志记录:详细记录错误信息

🎉 总结

本次开发成功实现了SQL缓存导出配置功能,为Excel导出提供了强大的数据转换能力:

主要成果

  1. 高性能缓存机制:通过预加载缓存显著提升导出性能
  2. 灵活的SQL配置:支持任意SQL查询和字段映射
  3. 简单易用的注解:简单的注解配置即可使用
  4. 完善的文档体系:提供详细的使用指南和最佳实践

技术亮点

  1. 静态缓存设计:使用ConcurrentHashMap实现高性能缓存
  2. 配置化管理:统一的SQL配置注册和管理机制
  3. 线程安全保证:支持多用户并发导出
  4. 错误处理完善:提供降级策略和详细日志

应用价值

  1. 性能提升:解决大量数据导出时的性能瓶颈
  2. 灵活性增强:支持复杂的业务数据转换需求
  3. 开发效率:简化导出功能的开发工作
  4. 可扩展性:为后续功能扩展提供基础

该功能特别适用于需要从多个业务表获取数据进行导出的场景,能够有效解决传统导出方式中的性能瓶颈问题,为项目的导出功能提供了强有力的技术支撑。