1. 项目背景与核心需求
在大学教务管理体系中,学生成绩管理始终是核心业务模块。传统基于Servlet/JSP的JavaEE方案存在配置繁琐、模块耦合度高的问题。我们采用SpringBoot+JavaEE技术栈重构这一系统,实现了以下核心功能:
- 多角色权限控制(教师/学生/管理员)
- 课程-成绩关联管理
- 数据可视化分析
- 批量导入导出功能
- 成绩预警机制
这套系统在我校计算机学院实际运行两年,日均处理3000+次成绩操作请求,经受了选课高峰期的并发考验。下面分享具体实现中的关键技术选型与架构设计。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体技术栈
code复制前端:Thymeleaf + Bootstrap + ECharts
后端:SpringBoot 2.7 + JavaEE 8
数据库:MySQL 8.0(主从分离)
中间件:Redis(缓存)+ RabbitMQ(异步处理)
选择SpringBoot而非传统JavaEE的主要考虑:
- 自动配置省去70%以上的XML配置
- 内嵌Tomcat简化部署
- Starter依赖一键集成常用组件
- Actuator提供完善监控
2.2 分层架构设计
code复制表现层:Controller处理HTTP请求
业务层:@Service实现核心逻辑
持久层:MyBatis-Plus操作数据库
数据层:MySQL分表存储
特别说明:虽然使用SpringBoot,但仍遵循JavaEE的分层规范,保持代码结构清晰。例如所有Controller类均放在com.score.web包下,与业务逻辑严格分离。
3. 核心功能实现
3.1 成绩录入模块
教师端采用"预提交+二次确认"机制:
java复制@Transactional
public String submitGrades(List<Grade> grades) {
// 1. 预检查
gradeValidator.checkDuplicate(grades);
// 2. 临时存储
tempGradeRepository.batchInsert(grades);
// 3. 发送确认邮件
emailService.sendConfirmMail();
return "待确认";
}
关键点:
- 使用MyBatis-Plus的批量插入(性能比单条插入提升8倍)
- @Transactional确保操作原子性
- 采用Redis缓存课程信息减少数据库查询
3.2 成绩分析模块
通过ECharts实现可视化:
javascript复制function initTrendChart() {
$.get('/api/grade/trend', function(data){
let chart = echarts.init(document.getElementById('chart'));
chart.setOption({
xAxis: {data: data.terms},
series: [{
type: 'line',
data: data.avgScores
}]
});
});
}
性能优化技巧:
- 使用@Cacheable缓存计算结果
- 定时任务预生成统计报表
- 大数据量时采用分片查询
4. 关键问题解决方案
4.1 并发成绩提交
采用乐观锁解决并发冲突:
java复制@Update("UPDATE course SET version=version+1
WHERE id=#{id} AND version=#{version}")
int updateWithVersion(Course course);
实测数据:
- 无锁:200并发时错误率12%
- 悲观锁:吞吐量下降40%
- 乐观锁:错误率<0.1%且性能影响小
4.2 大数据量导出
使用POI的SXSSFWorkbook处理Excel导出:
java复制// 每100条数据flush到磁盘
SXSSFWorkbook workbook = new SXSSFWorkbook(100);
Sheet sheet = workbook.createSheet();
for(Grade grade : gradeList) {
Row row = sheet.createRow();
// 填充数据...
}
对比测试:
- HSSF:5万条数据内存溢出
- XSSF:10万条占用1.5GB内存
- SXSSF:100万条内存稳定在200MB
5. 部署与监控
5.1 多环境配置
通过profile实现环境隔离:
yaml复制# application-dev.yml
spring:
datasource:
url: jdbc:mysql://dev-db:3306/score
---
# application-prod.yml
spring:
datasource:
url: jdbc:mysql://master:3306/score
slave: jdbc:mysql://slave:3306/score
启动命令:
bash复制java -jar score.jar --spring.profiles.active=prod
5.2 监控配置
集成SpringBoot Actuator:
properties复制management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
关键监控指标:
- 数据库连接池使用率
- 接口响应时间P99
- JVM内存波动
- 消息队列积压量
6. 踩坑与优化经验
- MyBatis批处理必须关闭自动提交:
yaml复制spring:
datasource:
hikari:
auto-commit: false
- Thymeleaf模板缓存问题:
开发阶段务必关闭缓存,否则修改不生效:
properties复制spring.thymeleaf.cache=false
- 日期字段序列化:
统一配置Jackson日期格式:
java复制@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder -> builder.dateFormat(new SimpleDateFormat("yyyy-MM-dd"));
}
- 接口性能优化三部曲:
- Nginx静态资源缓存
- 二级Redis缓存
- 数据库查询优化(索引+分表)
这套系统经过三次大版本迭代,目前稳定支持日均5万+访问量。最大的收获是:SpringBoot的便捷性需要与JavaEE的规范性相结合,既不能过度依赖自动配置,也不要排斥现代框架的特性。
