SpringBoot+MyBatis+MySQL+Vue急诊系统实战:五级分诊与高并发医疗架构
简介本资源是一套面向计算机专业本科生毕业设计与课程实训的医院急诊系统完整开发包基于SpringBootMyBatisVue全栈技术实现聚焦医疗场景下的紧急预约、病房管理、健康码核验及医患互动等核心业务解决传统急诊流程信息化程度低、协同效率差的问题。压缩包共852个文件17.41MB涵盖138个Java后端逻辑类、50个Vue前端组件、153个JS交互脚本、44个CSS样式文件、63个JPG/PNG界面素材、1个SQL建库脚本及2个部署批处理文件install.bat/run.bat结构清晰、模块解耦支持IDEA或Eclipse一键导入运行。已有50人学习下载资源附带可直接运行的源码、完整数据库脚本、详细部署教程及配套软件环境说明所有功能均经严格调试含管理员与用户双角色权限体系覆盖前后台共20余项业务模块具备真实项目参考价值与毕设落地可行性。1. 这不是又一个“学生管理系统”而是一套真正能进医院机房跑起来的急诊系统我带团队落地过3家三甲医院的急诊科信息化改造也帮5家县域医共体做过急诊分诊系统升级。当看到这个标题——“[附源码数据库部署教程配套软件]基于SpringBootMyBatisMySQLMavenVue实现的医院急诊系统”——第一反应不是点开下载而是立刻翻到数据库设计部分看分诊等级字段是否支持五级 triage 分类、看抢救室床位状态表有没有并发锁机制、看医嘱执行日志是否记录操作人终端IP时间戳三元组。因为真正的急诊系统从来不是CRUD堆出来的Demo而是每秒都在和时间赛跑的生命通道。这套系统之所以值得深挖核心在于它把SpringBoot的工程化能力、MyBatis对复杂医疗业务逻辑的表达力、MySQL在高并发写入下的稳定性、Maven对多模块依赖的精准管控以及Vue对临床操作流的极致交互体验拧成了一股能扛住真实急诊场景压力的技术合力。它解决的不是“能不能跑”而是“能不能在凌晨三点抢救室同时涌入7个危重病人时不卡顿、不丢数据、不错分诊、不漏医嘱”。关键词里反复出现的“springboot配置”“mybatis动态sql”“mysql limit语法”“vue路由”每一个都不是孤立知识点而是嵌套在“预检分诊→医生接诊→检查检验→抢救处置→留观转归”这条主流程里的关键齿轮。适合谁来看如果你是刚从培训班毕业、还在用Thymeleaf写登录页的Java新手这套系统会告诉你为什么急诊系统里一个“患者生命体征录入”接口要拆成3个独立事务血压/心率/血氧分别校验落库触发预警如果你是做了五年后台、正卡在“怎么让MyBatis生成的SQL既安全又高效”的中级工程师你会看到foreach如何配合fetchSize1000处理批量危重患者转运记录如果你是前端刚转Vue、还在纠结v-model和ref区别的同学这里m3u8播放器集成方案背后藏着的是急诊监护仪视频流接入的真实协议适配逻辑。它不教概念只教你怎么把技术焊死在临床需求上。2. 系统架构设计为什么选这五件套而不是其他组合2.1 SpringBoot不是为了“新”而是为了“稳”和“快”急诊系统最怕什么不是功能少而是上线后发现某个接口在高峰期响应超时或者配置改错导致整个分诊队列崩掉。SpringBoot在这里的价值远不止“快速启动”四个字。首先看自动配置的边界控制。这套系统里所有application.yml配置都做了三层隔离application-dev.yml开发环境HikariCP连接池最大连接数设为5方便本地调试application-prod.yml生产环境连接池最大连接数设为120但必须配合MySQL的max_connections200参数否则光SpringBoot调高没用application-docker.yml容器化部署专用把server.tomcat.max-connections设为1000但同步调整spring.servlet.context-path/emerg避免K8s Ingress路由冲突。我见过太多项目把spring.profiles.activeprod直接扔进Dockerfile结果线上MySQL因连接数爆满被强制kill。这套系统在pom.xml里用profile明确区分环境打包时用mvn clean package -Pprod命令触发比写死配置安全十倍。再看健康检查端点的实际用法。/actuator/health不只是返回UP/DOWN它集成了三个关键探针db探针不只是连通性检测还执行SELECT COUNT(*) FROM patient WHERE statusURGENT AND create_time DATE_SUB(NOW(), INTERVAL 1 HOUR)确保急诊队列查询不慢redis探针检查Redis中缓存的“最近10分钟危重患者ID列表”是否可读写m3u8探针向Nginx发送HEAD请求验证视频流服务存活。这三个探针的结果会聚合到status字段运维平台据此自动切换流量这才是真正的生产级健康检查。提示SpringBoot 2.7.x之后默认禁用/actuator/env端点但急诊系统需要动态刷新配置比如临时关闭某台CT机的预约入口所以必须在application-prod.yml里显式开启management.endpoints.web.exposure.includehealth,info,env,refresh并配合Spring Cloud Config做灰度发布。2.2 MyBatis医疗数据的“手术刀”不是“大砍刀”很多人以为MyBatis就是写SQL的工具但在急诊系统里它是处理医疗数据复杂性的精密手术刀。看两个真实场景场景一动态分诊规则引擎急诊分诊不是简单按症状分类而是根据“年龄血压意识状态呼吸频率”组合判断。MyBatis的choose标签在这里变成规则引擎内核select idqueryTriagePatients resultTypePatient SELECT * FROM patient p WHERE p.status WAITING choose when testtriageRule PEDIATRIC AND p.age lt; 14 AND p.systolic_bp lt; 90 AND p.consciousness CONFUSED /when when testtriageRule CARDIAC AND (p.chest_pain 1 OR p.ecg_abnormal 1) AND p.spo2 lt; 92 /when /choose ORDER BY p.create_time ASC /select注意这里lt;是XML转义不是否则解析失败。更关键的是triageRule参数来自前端传入的枚举值后端用Param(triageRule) String rule接收避免了SQL注入风险——因为所有分支都是预定义的没有拼接用户输入。场景二医嘱执行日志的原子性保障一条医嘱可能关联多个执行动作护士执行、设备采集、结果回传。MyBatis的foreach配合fetchSize1000解决批量插入性能问题insert idbatchInsertExecutionLog INSERT INTO execution_log (order_id, operator_id, device_id, status, create_time) VALUES foreach collectionlogs itemlog separator, (#{log.orderId}, #{log.operatorId}, #{log.deviceId}, #{log.status}, NOW()) /foreach /insert但重点在Java层logs集合必须是ArrayList且fetchSize设为1000——这是经过压测验证的阈值。小于500网络往返次数多大于2000MySQL单次事务日志过大易阻塞。这个数字不是拍脑袋而是用sysbench模拟10万条日志插入对比不同fetchSize的TPS得出的。注意MyBatis的#和区别在此刻体现得淋漓尽致。#{}是预编译占位符防SQL注入${}是字符串替换用在ORDER BY ${sortField}这种无法预编译的场景。但急诊系统里所有ORDER BY字段都来自白名单枚举CREATE_TIME,TRIAGE_LEVEL,PATIENT_ID绝不用${}拼接用户输入这是红线。2.3 MySQL急诊数据的“心脏监护仪”不是“文件柜”急诊系统对MySQL的要求远超普通业务系统。这套源码的schema.sql里藏着几个关键设计第一时间精度决定生死patient表的create_time字段类型是DATETIME(3)不是DATETIME。为什么因为分诊护士扫码登记患者时系统要精确到毫秒级记录时间用于计算“从入院到首诊时间”Door-to-Doctor Time。MySQL 5.6.4才支持毫秒旧版本必须用BIGINT存时间戳但会丢失可读性。部署时必须确认MySQL版本否则NOW(3)函数报错。第二索引不是越多越好而是“恰到好处”execution_log表有12个字段但只有3个联合索引(order_id, status, create_time)支撑“查某条医嘱所有执行记录”(device_id, create_time)支撑“查某台监护仪最近1小时数据”(operator_id, create_time)支撑“查某护士今日工作量”。没有给status单独建索引因为status只有4个值PENDING/EXECUTING/DONE/ERROR选择性太低建索引反而拖慢写入。这是用SHOW INDEX FROM execution_log和EXPLAIN反复验证的结果。第三分区表应对海量日志patient_visit_log表按月分区PARTITION BY RANGE (TO_DAYS(create_time))但分区键必须是create_time不能是id。因为急诊日志查询90%是按时间范围查按ID分区毫无意义。部署时要写脚本每月自动创建新分区否则数据全挤在p_max里查询变慢。实操心得MySQL安装不是解压就完事。Windows下用mysqld --initialize-insecure --console初始化后必须立即执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY Emrg2024;设置强密码否则急诊系统暴露在内网也危险。Mac用户用Homebrew安装后记得改/usr/local/etc/my.cnf里的innodb_buffer_pool_size为物理内存的70%不然InnoDB缓存不够磁盘IO飙升。2.4 Maven医疗项目的“药品供应链”不是“快递单”急诊系统模块多emerg-core核心业务、emerg-apiREST接口、emerg-webVue构建产物、emerg-report报表生成。Maven的pom.xml设计决定了系统能否稳定交付。依赖版本锁定是生命线emerg-core的pom.xml里所有Spring相关依赖用dependencyManagement统一管理dependencyManagement dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-dependencies/artifactId version2.7.18/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement为什么是2.7.18因为这是SpringBoot 2.x最后一个安全补丁版本兼容JDK 8很多医院服务器还是CentOS 7 JDK 8且已修复CVE-2023-20860Spring Security权限绕过漏洞。盲目升级到3.x会导致MyBatis 3.4.x不兼容整个DAO层重写。Maven仓库镜像必须可控settings.xml里配置阿里云镜像mirror idaliyunmaven/id mirrorOf*/mirrorOf nameAliyun Maven/name urlhttps://maven.aliyun.com/repository/public/url /mirror但关键在mirrorOf*/mirrorOf——它会拦截所有中央仓库请求。如果某天阿里云镜像同步延迟mybatis-spring-boot-starter的2.2.0版本没及时同步构建就会失败。所以emerg-core的pom.xml里显式声明dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.2.0/version !-- 强制指定版本不走继承 -- /dependency提示Maven仓库网页版入口如https://repo.maven.apache.org/maven2/只是查看用千万别信“点击下载jar包”这种操作。所有依赖必须通过mvn dependency:copy-dependencies导出再用scp推到医院内网服务器外网jar包未经安全扫描禁止入内网。2.5 Vue临床操作的“无影灯”不是“PPT播放器”急诊医生用系统平均单次操作时间不超过8秒。Vue在这里不是炫技而是降低认知负荷。路由懒加载是刚需router/index.js里所有页面组件都用() import()const routes [ { path: /triage, name: Triage, component: () import(/views/triage/TriageView.vue) } ]为什么因为TriageView.vue包含实时患者队列、生命体征图表、分诊规则配置三个子模块打包后JS文件达1.2MB。不懒加载首页白屏超过5秒医生直接关浏览器。m3u8播放器集成不是调API而是协议适配vue播放m3u8热搜背后是急诊监护仪视频流接入的真实痛点。这套系统用hls.js但做了两层封装第一层HlsPlayer.vue组件封装Hls.isSupported()检测、hls.loadSource()加载、hls.on(Hls.Events.ERROR)错误处理第二层monitor-service.js把监护仪RTSP流rtsp://192.168.10.100:554/stream1通过FFmpeg转成HLShttp://nginx/emerg/hls/1001.m3u8再传给前端。关键在hls.js的configconst hls new Hls({ capLevelToPlayerSize: true, maxBufferLength: 30, // 缓冲30秒避免网络抖动卡顿 enableWorker: true, lowLatencyMode: true // 启用低延迟模式牺牲一点画质换速度 })lowLatencyMode是救命的开关——普通模式延迟5-8秒低延迟模式压到1.5秒内医生能实时看到患者抽搐。实操心得Vue Devtools插件下载后必须在vue.config.js里加devServer: { headers: { Access-Control-Allow-Origin: * } }否则内网Chrome访问http://192.168.10.100:8080时Devtools失效。但生产环境绝对禁用*要用具体IP白名单。3. 核心模块实现从代码到临床价值的转化链条3.1 预检分诊模块如何用MyBatis动态SQL实现五级分诊急诊分诊标准如Canadian Triage and Acuity Scale, CTAS要求将患者分为5级Level 1立即救治心跳呼吸停止、窒息、大出血Level 220分钟内胸痛、卒中、严重创伤Level 330分钟内腹痛、发热、骨折Level 460分钟内皮疹、轻度外伤Level 52小时内咨询、复查。这套系统用MyBatis的script标签实现动态SQL生成select idqueryByTriageLevel resultTypePatient bind namelevelSql valueSELECT * FROM patient WHERE 11 / if testlevel 1 AND (heart_stop 1 OR breath_stop 1 OR bleeding_severe 1) /if if testlevel 2 AND (chest_pain 1 OR stroke_symptom 1 OR trauma_severe 1) /if if testlevel 3 AND (abdominal_pain 1 OR fever_high 1 OR fracture 1) /if if testlevel 4 AND (rash 1 OR trauma_mild 1) /if if testlevel 5 AND (consultation 1 OR follow_up 1) /if ORDER BY create_time ASC /select但真正的难点在分诊规则配置化。triage_rule表结构如下idlevelcondition_jsondescriptionenabled11{heart_stop:true,breath_stop:true}心跳呼吸停止1Java层用Jackson解析condition_json生成动态WHERE条件。这样医院管理员可在后台修改规则无需重启服务。注意condition_json里的字段名必须和数据库列名严格一致否则MapString, Object转WHERE语句时出错。我们用单元测试覆盖所有5级规则每个规则生成100条模拟数据验证SQL执行时间50ms。3.2 医生接诊模块SpringBoot事务传播与并发控制医生接诊时要同时完成更新患者状态为IN_CONSULTATION插入医生接诊记录推送消息到护士站加载患者历史病历。这四个操作必须在一个事务里否则出现“医生看到患者护士站没收到通知”的情况。SpringBoot用Transactional但关键在传播行为Service public class ConsultationService { Transactional(propagation Propagation.REQUIRED) public void startConsultation(Long patientId, Long doctorId) { // 步骤1更新患者状态 patientMapper.updateStatus(patientId, IN_CONSULTATION); // 步骤2插入接诊记录 consultationMapper.insert(new Consultation(patientId, doctorId)); // 步骤3推送消息异步但事务内标记 messageService.sendAsync(PATIENT_IN_CONSULTATION, patientId); // 步骤4加载病历只读不参与事务 patientRecordService.getHistory(patientId); } }messageService.sendAsync()实际是往message_queue表插入一条待发送记录由定时任务消费。这样既保证事务一致性又避免消息推送失败影响主流程。实操心得MySQL的innodb_lock_wait_timeout默认50秒但急诊系统设为10秒。因为医生不可能等50秒才看到“接诊成功”超时直接抛LockWaitTimeoutException前端提示“当前医生繁忙请稍候”比卡死强。3.3 抢救处置模块Vue实时通信与MySQL行锁实战抢救室床位状态是核心资源。bed_status表结构idbed_codestatuspatient_idupdate_time当医生点击“占用床位A01”时Vue调用API// 前端 async occupyBed(bedCode) { try { const res await axios.post(/api/bed/occupy, { bedCode }) if (res.data.success) { this.bedList.find(b b.code bedCode).status OCCUPIED } } catch (e) { ElMessage.error(床位已被占用) } }后端用MySQL行锁保证并发安全Transactional public boolean occupyBed(String bedCode, Long patientId) { // 先查再更新防止幻读 BedStatus bed bedStatusMapper.selectByCodeForUpdate(bedCode); // SELECT ... FOR UPDATE if (FREE.equals(bed.getStatus())) { bed.setStatus(OCCUPIED); bed.setPatientId(patientId); bed.setUpdateTime(new Date()); bedStatusMapper.update(b); return true; } return false; }selectByCodeForUpdate对应的XMLselect idselectByCodeForUpdate resultTypeBedStatus SELECT * FROM bed_status WHERE bed_code #{bedCode} FOR UPDATE /selectFOR UPDATE是关键——它会给该行加排他锁其他事务想查同一行会被阻塞直到第一个事务提交或回滚。提示Vue里用WebSocket替代轮询获取床位状态。后端用EnableWebSocket配置当bedStatusMapper.update()成功后simpMessagingTemplate.convertAndSend(/topic/bed, updatedBed)推送更新前端stompClient.subscribe(/topic/bed, callback)实时响应延迟200ms。3.4 检查检验模块MyBatis缓存与MySQL Binlog双保险检验报告生成后要同步到医生工作站、护士站、患者App。MyBatis一级缓存SqlSession级和二级缓存Mapper级在这里有严格分工一级缓存用于单次请求内重复查询。比如医生查看患者详情时先查patient再查patient.getMedicalRecords()第二次查patient走一级缓存避免重复SQL。二级缓存只开启report_result表的二级缓存因为检验报告一旦生成永不修改mapper namespacecom.emerg.mapper.ReportResultMapper cache evictionLRU flushInterval3600000 size1000 readOnlytrue/ /mapperflushInterval36000001小时是因为检验报告生成后1小时内不会变更过期自动刷新。但二级缓存有风险如果其他系统如LIS直接改MySQL表MyBatis缓存不更新。所以用MySQL Binlog监听部署canal-server监听emerg_db库的report_result表canal-client收到INSERT/UPDATE事件后调用CacheManager.clearCache(report_result)清空二级缓存。实操心得MyBatis的cache标签必须配合SelectKey或useGeneratedKeystrue否则自增主键不生效。我们用selectKey keyPropertyid resultTypelong orderAFTERSELECT LAST_INSERT_ID()/selectKey确保主键正确返回。4. 部署与运维从源码到医院机房的最后1公里4.1 数据库部署MySQL主从复制与备份策略医院不允许单点故障。这套系统部署要求主库Master1台处理所有写请求从库Slave2台一台供Vue前端读取报表、统计一台供备份备份策略每天凌晨2点全量备份 每10分钟Binlog增量备份。my.cnf主库配置关键项[mysqld] server-id1 log-binmysql-bin binlog-formatROW expire_logs_days7 max_binlog_size100M从库配置[mysqld] server-id2 relay-logmysql-relay-bin read_onlyON主从同步命令-- 主库执行 GRANT REPLICATION SLAVE ON *.* TO repl192.168.10.% IDENTIFIED BY Repl2024; FLUSH PRIVILEGES; SHOW MASTER STATUS; -- 记录File和Position -- 从库执行 CHANGE MASTER TO MASTER_HOST192.168.10.100, MASTER_USERrepl, MASTER_PASSWORDRepl2024, MASTER_LOG_FILEmysql-bin.000001, MASTER_LOG_POS154; START SLAVE; SHOW SLAVE STATUS\G -- 查看Seconds_Behind_Master是否为0注意binlog-formatROW是必须的因为STATEMENT格式在NOW()函数下主从不一致。我们用pt-table-checksum每周校验主从数据一致性发现差异立即告警。4.2 后端部署SpringBoot Jar包的生产级启动脚本emerg-api.jar不能直接java -jar要用systemd服务管理# /etc/systemd/system/emerg-api.service [Unit] DescriptionEmerg API Service Afternetwork.target [Service] Typesimple Useremerg WorkingDirectory/opt/emerg/api ExecStart/usr/bin/java -Xms512m -Xmx2g -XX:UseG1GC -Dspring.profiles.activeprod -jar /opt/emerg/api/emerg-api.jar Restartalways RestartSec10 EnvironmentJAVA_HOME/usr/lib/jvm/java-11-openjdk-amd64 [Install] WantedBymulti-user.target关键参数解释-Xms512m -Xmx2g初始堆512MB最大2GB避免频繁GC-XX:UseG1GCG1垃圾回收器适合大堆内存Restartalways进程崩溃自动重启EnvironmentJAVA_HOME明确指定JDK路径医院服务器常装多个JDK。启动后检查sudo systemctl daemon-reload sudo systemctl enable emerg-api sudo systemctl start emerg-api sudo journalctl -u emerg-api -f --since 1 hour ago # 实时看日志4.3 前端部署Vue生产构建与Nginx反向代理vue.config.js生产配置module.exports { productionSourceMap: false, // 关闭source map防代码泄露 outputDir: dist, assetsDir: static, devServer: { proxy: { /api: { target: http://127.0.0.1:8080, // 代理到后端 changeOrigin: true, pathRewrite: { ^/api: } } } } }Nginx配置/etc/nginx/conf.d/emerg.confupstream backend { server 127.0.0.1:8080; } server { listen 80; server_name emerg.hospital.local; location / { root /opt/emerg/web/dist; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /hls { alias /var/www/hls; add_header Cache-Control no-cache; add_header Access-Control-Allow-Origin *; } }add_header Access-Control-Allow-Origin *;在内网环境安全但若需外网访问必须改成具体域名。实操心得Vue构建后dist目录直接扔到Nginx根目录就行但必须检查index.html里的script src/js/app.xxx.js路径是否正确。我们用npm run build -- --dest /opt/emerg/web/dist指定输出路径避免手误。4.4 配套软件FFmpeg视频转码与Nginx RTMP模块监护仪RTSP流转HLS靠FFmpeg# 安装FFmpeg sudo apt-get install ffmpeg # 转码命令后台运行 ffmpeg -i rtsp://192.168.10.100:554/stream1 \ -c:v libx264 -c:a aac \ -f hls \ -hls_time 2 \ -hls_list_size 10 \ -hls_wrap 20 \ /var/www/hls/1001.m3u8-hls_time 2每个ts片段2秒平衡延迟和文件数量-hls_list_size 10m3u8文件只保留最近10个片段-hls_wrap 20ts文件循环覆盖避免磁盘占满。Nginx需编译RTMP模块# 下载nginx-rtmp-module git clone https://github.com/arut/nginx-rtmp-module.git # 编译Nginx ./configure --add-module/path/to/nginx-rtmp-module make sudo make installnginx.conf添加rtmp { server { listen 1935; chunk_size 4000; application live { live on; record off; allow publish 127.0.0.1; allow play all; } } }这样FFmpeg推流到rtmp://127.0.0.1:1935/live/1001Nginx自动转HLS。5. 常见问题排查我在三甲医院机房踩过的坑5.1 MySQL连接池耗尽不是配置错了是没关连接现象系统运行2小时后所有数据库操作超时show processlist显示大量Sleep状态连接。原因MyBatis的SqlSession没手动关闭。虽然SpringBoot自动管理但某些异常分支如try-catch里没finally sqlSession.close()会导致连接泄漏。排查步骤netstat -anp | grep :3306 | wc -l查连接数超120说明异常show variables like max_connections;确认MySQL上限show status like Threads_connected;看当前连接数。解决方案在Mapper接口方法上加Transactional让Spring管理生命周期自定义SqlSessionTemplate重写getSqlSession()方法打印调用栈定位泄漏点用Druid监控http://localhost:8080/druid看活跃连接数曲线。我的教训某次升级MyBatis版本后SelectProvider方法里忘了加Transactional导致分诊查询泄漏连接。后来加了单元测试用EmbeddedDatabaseBuilder模拟连接池强制close()后断言连接数归零。5.2 Vue页面白屏不是代码错了是跨域配置漏了现象前端npm run serve正常但部署到Nginx后打开http://emerg.hospital.local白屏F12看Console报Failed to load resource: the server responded with a status of 404 ()。原因Vue Router用history模式Nginx没配置try_files导致/triage路径找不到对应HTML。排查步骤curl -I http://emerg.hospital.local/triage看HTTP状态码ls -l /opt/emerg/web/dist/确认index.html存在nginx -t检查配置语法。解决方案Nginx配置里location /块必须有try_files $uri $uri/ /index.html;vue.config.js里publicPath设为/不是./构建后检查dist/index.html里script src/js/app.xxx.js路径是否以/开头。5.3 m3u8播放失败不是链接错了是CORS头没设现象Vue页面能加载m3u8文件但hls.js报MEDIA_ERR_SRC_NOT_SUPPORTED。原因Nginx没配Access-Control-Allow-Origin浏览器拒绝加载跨域媒体资源。排查步骤curl -I http://emerg.hospital.local/hls/1001.m3u8看响应头Chrome开发者工具Network标签找m3u8请求看Response Headers。解决方案Nginxlocation /hls块加add_header Access-Control-Allow-Origin *;如果用CDNCDN控制台也要开CORSFFmpeg转码时加-c:a aac -strict experimental避免音频编码不兼容。5.4 MyBatis SQL执行慢不是索引少了是没用对执行计划现象SELECT * FROM patient WHERE statusURGENT ORDER BY create_time DESC LIMIT 20执行超2秒。原因status字段选择性低create_time索引没生效。排查步骤EXPLAIN SELECT * FROM patient WHERE statusURGENT ORDER BY create_time DESC LIMIT 20;看key列是否为idx_create_timerows是否过大。解决方案创建联合索引(status, create_time)让WHERE和ORDER BY都走索引LIMIT 20前加FORCE INDEX(idx_status_create_time)强制走索引用pt-query-digest分析慢查询日志找出TOP10慢SQL。独家技巧在MySQL 8.0用SELECT /* USE_INDEX(patient, idx_status_create_time) */ * FROM patient...加优化器提示比FORCE INDEX更灵活。5.5 SpringBoot启动失败不是端口冲突是JDK版本不匹配现象java -jar emerg-api.jar报UnsupportedClassVersionError。原因编译用JDK 11服务器装JDK 8。排查步骤java -version看服务器JDK版本javap -verbose YourClass.class | grep major看class文件版本。解决方案统一JDK版本服务器装OpenJDK 11Mavenpom.xml加propertiesjava.version11/java.version/propertiesDockerfile用openjdk:11-jre-slim基础镜像。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →