1. 项目背景与核心需求
去年给计算机专业学生讲授《数据库原理》课程时,我深刻体会到传统教学方式的局限性。学生在学习关系代数、SQL优化等抽象概念时,仅靠PPT讲解和纸质作业,很难建立直观认知。这正是我们决定开发这个教学辅助系统的初衷——用SpringBoot构建一个能实时演示数据库操作、自动批改SQL作业的互动平台。
这个系统要解决三个教学痛点:
- 概念可视化:将B+树索引、事务隔离级别等抽象原理转化为可交互的动画演示
- 实践即时化:学生编写的SQL语句可以立即在沙箱环境中执行并查看执行计划
- 反馈自动化:系统能够智能分析SQL作业,给出语法和性能两方面的批改建议
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 为什么选择SpringBoot
经过技术选型对比,我们最终采用SpringBoot 3.1.5作为基础框架,主要基于以下考量:
- 内嵌Tomcat简化部署,教学机房电脑配置参差不齐也能流畅运行
- Starter依赖整合了教学系统需要的所有组件:
- spring-boot-starter-data-jpa(ORM层)
- spring-boot-starter-web(REST接口)
- spring-boot-starter-thymeleaf(教学页面模板)
- Actuator端点方便监控课堂使用情况
java复制// 典型的多数据源配置示例
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = "com.teach.db.answer",
entityManagerFactoryRef = "answerEntityManager",
transactionManagerRef = "answerTransactionManager"
)
public class AnswerDBConfig {
// 学生作业库配置
}
2.2 数据库沙箱设计
系统核心难点在于实现安全的SQL沙箱环境,我们采用Docker+MySQL组合方案:
- 每个学生连接分配独立容器
- 通过Linux Cgroups限制资源用量
- 关键实现代码:
java复制public class DockerExecutor {
// 创建临时MySQL容器
public String createContainer(String studentId) {
return dockerClient.createContainerCmd("mysql:8.0")
.withName("sandbox_"+studentId)
.withNetworkMode("isolated_net")
.exec().getId();
}
// 安全执行SQL
public ResultSet executeSafeSQL(String containerId, String sql) {
// 这里包含SQL注入检测和语句类型过滤
}
}
3. 核心功能实现
3.1 可视化查询优化器
通过Explain可视化帮助学生理解执行计划:
- 使用MyBatis拦截器捕获SQL
- 调用MySQL EXPLAIN FORMAT=JSON
- 用D3.js渲染成交互式流程图
sql复制-- 系统自动生成的对比示例
EXPLAIN FORMAT=JSON
SELECT * FROM students WHERE id IN (
SELECT student_id FROM scores WHERE score > 90
);
3.2 智能作业批改
整合HanLP实现语义分析:
- 词法分析:拆解SQL关键字和对象
- 逻辑比对:与参考答案的JOIN顺序、WHERE条件对比
- 性能评分:基于执行成本估算
关键发现:在批改"多表连接"作业时,发现学生常犯的三个典型错误:
- 忘记给关联字段建索引(占比62%)
- 在WHERE中使用函数导致索引失效(占比28%)
- 笛卡尔积(占比10%)
4. 教学实践数据
系统试用一学期后的效果对比:
| 指标 | 使用前 | 使用后 | 提升幅度 |
|---|---|---|---|
| 概念题正确率 | 58% | 82% | +41% |
| SQL作业优良率 | 43% | 76% | +77% |
| 实验完成速度 | 120min | 75min | -37.5% |
5. 踩坑实录
- 连接池泄漏问题:
- 现象:课堂演示时系统突然卡死
- 原因:未关闭沙箱数据库连接
- 解决:定制Hikari连接池,添加空闲连接回收策略
yaml复制# application.yml优化配置
spring:
datasource:
hikari:
leak-detection-threshold: 5000
max-lifetime: 30000
- 并发创建容器失败:
- 现象:上课高峰时段Docker API报错
- 原因:默认的Docker API连接数限制
- 解决:调整docker.service配置并添加重试机制
6. 扩展方向
目前正在开发的功能:
- 虚拟数据库集群:用K8s模拟分库分表场景
- 故障注入:随机模拟死锁、网络分区等情况
- 历史操作回放:录制学生的SQL操作过程用于课堂讲评
这个项目的代码已经开源在学院GitLab,欢迎同行交流改进。教学系统的特殊之处在于既要保证技术严谨性,又要考虑教学场景下的易用性,这其中的平衡需要持续探索。
