全部学科
Python全栈
python
NodeJS全栈
nodejs

生产环境最佳实践专题测试

10 题 50 分钟 难度:★★★

考察知识点

  • SQL 注入防护:参数化查询、白名单校验、纵深防御策略、<bind> 标签安全风险
  • 线程安全与并发:SqlSessionFactory/SqlSession/Mapper 线程安全特性、二级缓存并发问题与分布式缓存方案
  • 监控与告警:SQL 性能指标采集、连接池监控、缓存命中率、告警分级策略、避免监控成为性能瓶颈
  • 异常处理与重试:事务回滚机制、可重试/不可重试异常分类、Spring Retry 实现、幂等性设计
  • 热部署与配置刷新:XML 热加载流程、Configuration 更新、线程安全保证、失败回滚机制、配置中心集成
💡 参考答案在文末
多选题
1

在生产环境中,针对 MyBatis 的监控体系,以下哪些指标是必须纳入告警范围的核心指标?

A

SQL 执行时间超过 500ms 的慢查询数量

B

数据库连接池活跃连接数占最大连接数的比例超过 80%

C

MyBatis 一级缓存命中率和二级缓存命中率

D

Mapper 方法的调用频率与平均响应时间趋势

2

在生产环境中,以下哪些做法可以有效防止 MyBatis 的 SQL 注入攻击?

A

所有参数绑定统一使用 #{},仅在白名单校验后的 ORDER BY 和动态表名场景才使用 ${}

B

使用 <bind> 标签拼接用户输入到 SQL 中,因为它会自动进行 OGNL 转义

C

在 MyBatis 拦截器中对 SQL 进行关键字黑名单检测(如 UNION、DROP、DELETE 等)

D

对于 ${} 引用的参数,在 Java 层通过正则表达式校验只允许字母、数字和下划线组合

E

关闭 MyBatis 的 logImpl 配置,避免 SQL 日志泄露敏感参数信息

3

生产环境中防御 MyBatis SQL 注入攻击,以下哪些措施是有效的纵深防御策略?

A

在 MyBatis 自定义拦截器中检测 SQL 中是否包含 UNION、DROP 等危险关键字并拦截

B

所有使用 ${} 的参数必须经过白名单校验(如表名、排序字段限定在预定义集合内)

C

启用 MyBatis 的 safeResultHandlerEnabled 配置防止结果集注入

D

使用 SQL 防火墙(如 SQL 审计代理)在数据库层拦截异常 SQL 模式

4

在高并发 Web 应用中使用 MyBatis,以下关于线程安全的描述,正确的有哪些?

A

SqlSessionFactory 是线程安全的,整个应用生命周期只需创建一个实例

B

SqlSession 是线程安全的,可以在多个线程间共享同一个 SqlSession 实例

C

Mapper 接口代理对象本身无状态,但底层依赖 SqlSession,因此不应跨线程共享

D

MyBatis 一级缓存(Local Cache)绑定在 SqlSession 上,多线程共享 SqlSession 会导致缓存数据混乱

5

在生产环境中实现 MyBatis 配置的热部署与动态刷新,以下说法正确的有:

A

通过 Nacos/Apollo 等配置中心推送新配置后,MyBatis 的 configuration.xml 中的配置可以实时生效

B

使用 Spring Boot + MyBatis-Spring-Boot-Starter 时,修改 application.yml 中的 mybatis.configuration 属性需要重启应用才能生效

C

实现 Mapper XML 文件热加载,需要在应用运行期间重新解析 XML 并更新 Configuration 对象中的 MappedStatement 注册表

D

MyBatis-Plus 的 GlobalConfig 中 isRefresh 参数在生产环境应设置为 true 以实现 XML 热加载

填空题
6

在 MyBatis 生产环境中防止 SQL 注入,以下关键措施需要正确实现:

  1. 参数绑定必须使用 #{} 而不是 ____________,因为前者使用 ____________ 机制避免注入
  2. 对于必须使用 ${} 的场景(如动态 ORDER BY 字段),必须通过 ____________ 校验限制输入范围
  3. 在 XML 中编写动态 SQL 时,<bind> 标签的 value 属性中如果拼接了用户输入,同样存在 答案4 风险
7

MyBatis 二级缓存(二级 Cache)在多节点部署和高并发场景下存在以下问题:

  1. 默认二级缓存使用 PerpetualCache(基于 ____________),多线程并发读写需要加锁,MyBatis 通过 ____________ 模式减少锁竞争
  2. 在集群多节点部署时,各节点的二级缓存相互独立,会导致 ____________ 问题,应改用 答案4 实现分布式缓存
  3. 使用 @CacheNamespace 注解开启二级缓存时,flushInterval 设置过小会导致频繁 答案5,影响高并发下的读性能
简答题
8

某电商平台在促销活动期间,MyBatis 查询响应时间飙升,但事后排查发现没有任何监控告警提前发现问题。请设计一套完整的 MyBatis 生产环境监控方案,要求包含:

  1. 需要采集的核心指标及采集方式
  2. 指标存储与可视化方案
  3. 告警规则设计(含分级策略)
  4. 如何避免监控本身成为性能瓶颈
9

某支付系统使用 MyBatis 进行订单状态更新,偶发数据库死锁异常(Deadlock found when trying to get lock),部分订单更新失败。团队直接在 catch 块中对原方法进行重试,但出现了 TransactionAlreadyCompletedException 和重复扣款问题。请分析:

  1. 为什么在同一个事务内 catch 后重试会抛出 TransactionAlreadyCompletedException
  2. 死锁异常和约束违反异常(如 Duplicate Key)在重试策略上应如何区别对待?
  3. 在 Spring 环境下,如何正确实现可重试的数据库操作?
  4. 如何防止重试过程中出现重复扣款等幂等性问题?
10

某金融系统要求在不重启服务的情况下,支持动态调整 MyBatis 的 Mapper XML SQL 语句(例如紧急修复一个性能有问题的 SQL)。请设计一套生产环境可用的 MyBatis SQL 热部署方案,要求:

  1. 描述 XML 变更的监听与触发机制
  2. 说明如何安全地重新加载 XML 并更新 MyBatis 的 Configuration
  3. 如何保证热加载过程中的线程安全(加载期间正在执行的 SQL 不受影响)
  4. 如果新 SQL 加载失败,如何实现自动回滚到旧版本
参考答案
1.A;B;C;D 2.A;C;D 3.A;B;D 4.A;C;D 5.B;C 6.答案1;答案2;答案3 7.答案1;答案2;答案3 8. 9. 10.
想在手机上练习这套试卷?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一套试卷 源码架构与核心原理专题测试
下一套试卷 → 生态工具与扩展专题测试
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码