1
0
md/Java_3-5.md
2025-09-11 10:33:20 +08:00

3.4 KiB
Raw Blame History

问题1考察多线程

假设你现在需要写1个电商APP的用户订单详情接口这个详情页包含

  • 关联的商品信息,比如商品名称、尺码、图片、文字介绍等等
  • 订单的基础信息,比如创建时间、支付金额
  • 订单的快递信息,比如从上海运往杭州,目前运输车辆的位置

提问这三种数据彼此之间不耦合假定每一个查询耗时1秒单线程的情况下同步执行三次查询则需要3秒如何加速这个查询

答案:多线程并行查询

追问假定有3个Runnable对象分别是task1、task2、task3作为查询函数对象如何调度或者编排这3个task

如果没反应过来,引导一下:比如说用 CompletableFuture、Future 或者 FutureTask 说一下关键,要调用哪几个函数。

方案一、使用 CompletableFuture 的 runAsync 函数包装3个task。再通过 allOf 函数添加3个task调用 get 函数阻塞等待3个任务执行完毕。

方案二、使用Future把3个task提交给1个自定义线程池并接收Future对象再使用get函数等待3个任务执行完毕

如果回答的是CompletableFuture继续延伸以下问题

CompletableFuture的默认线程池是什么

答案ForkJoinPool

ForkJoinPool适合CPU密集型还是IO密集型任务

答案CPU密集型

用CompletableFuture处理IO密集型的任务应该怎么做

答案自定义一个IO密集型的线程池

问题2考察对 Mybatis-Plus 或者 Mybatis 框架的掌握程度)

假设现在需要针对用户表里的手机号、身份证号码加密存储,业务上还需要根据手机号后4位身份证号后6位的筛选。

提问:请基于 Spring Boot 和 Mybatis 或 Mybatis Plus说一下*手机号*和*身份证号*写入时加密,查询时解密,并且支持*手机号后4位*和*身份证号后6位*的筛选的实现思路。

详细答案:声明一个自定义注解,修饰实体类里的手机号和身份证号码。实现 Mybatis Plus 的 MetaObjectHandler 接口,覆写 insertFill 和 updateFill 处理数据的加密。实现 Mybatis 的 Interceptor 接口,拦截 ResultSetHandler 的 handleResultSets 函数,处理数据的解密。

简略答案:用自定义注解结合 Mybatis Plus 的自动填充功能实现数据加密,通过 Mybatis 的拦截器,实现数据的解密过程。

大多数会倒在数据解密的实现,没答出来也不要紧,答出来说明水平较高。

问题3考察问题分析处理能力

如何监控系统里的慢SQL

这道题可能会难倒一大片菜鸟,答出来说明有点厉害。

通过数据库连接池进行监测比如Druid连接池。Druid 内建了监控系统,收集了大量的查询相关的指标。通过 Druid Console 直接在网页端查看,或者使用 Druid 的导出器将数据同步到 Prometheus 和 Grafana。定义好慢SQL的特征比如超过5s。在 Druid Console 或者 Grafana 查看这样的数据即可。