久远银海 Java 开发:线下笔试 + 面试真题
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
线下笔试 + 面试。笔试卷是选择题加大题,没有手撕,大题四道 SQL、两道 Java 编程(文件输入输出流、递归)。随后是技术面:
- 讲讲项目中你担任的角色,开发过程中遇到的所有难点,以及你是如何解决的?
- 讲讲你是如何设计你的高并发秒杀机制的?
- 如果某个用户抢购成功,但是他要退款,你如何设计这段业务?
- 为什么要使用 Lua 脚本来实现库存扣减?
- 我看你写了压测数据,你是怎么得到优化前后的数据的?(450ms、68ms 两个数据怎么来的)
- 你简历上写了一个异步批量持久化数据,是怎么实现的?这个用来解决什么问题的?
- 讲讲你是如何优化你的数据库的?
- 我看你写了动态 SQL,MyBatis 中
${}和#{}的区别是什么? - 你有没有考虑过系统数据过多进行分库分表?
- 你为哪些字段设置了联合索引,依据是什么?
《参考解析》
${} 与 #{}
#{} 走预编译占位符,参数作为绑定值传给数据库,天然防注入;${} 是字符串拼接,直接把内容塞进 SQL,只适合表名、列名、排序字段这类无法参数化的位置,而且必须由服务端白名单校验后再拼,不能接用户输入。
联合索引的依据
先看查询模式:WHERE 里高频出现、区分度高、且能覆盖排序的列排在前面。等值条件的列靠左,范围条件的列靠后——范围之后的列用不上索引定位。索引不是越多越好,每个索引都要付出写入放大和存储成本,建之前先确认它真能被某条线上 SQL 命中,上线后用执行计划的 key_len 验证。
退款业务建模
秒杀订单的退款不能简单把库存加回去。要区分「未支付超时关闭」和「已支付退款」两条路径:前者释放预占库存,后者走逆向单,库存回补与支付退款都要幂等。退款本身是一条独立状态机,用业务单号唯一约束防止重复退款,库存回补用带版本的原子自增并留流水,便于对账。
要不要分库分表
先判断是真瓶颈还是可优化项:加索引、改写 SQL、加缓存、归档冷数据、读写分离,这些的成本远低于分片。只有当单表数据量、写入 QPS 或单机容量确实到顶,且业务能接受分片键带来的跨片查询与事务限制时才做。分片键要选查询必带、分布均匀的维度,否则会把问题从「慢」变成「查不出来」。
压测数据要能讲清来源
面试官问的其实是数据是怎么测出来的:用什么工具、多少并发、压了多久、预热没有、机器什么配置、瓶颈落在哪一层。优化前后的对比必须固定其他变量,只改一处。答不上来源的优化数字,比不写还减分。