以下是针对 Java 面试者 的 数据库与持久层 + NoSQL 综合题目,涵盖核心知识点、实际应用场景和进阶问题:
一、数据库与持久层题目
1. JDBC 与 ORM 框架
题目:
- JDBC 和 MyBatis/Hibernate 各有什么优缺点?在什么场景下你会优先选择 JDBC 而不是 ORM 框架?
解析:
- JDBC 优点:
- 直接控制 SQL,灵活性高,适合复杂查询优化。
- 无框架依赖,轻量级。
- JDBC 缺点:
- 需手动处理连接、结果集映射,代码冗长。
- 容易引发 SQL 注入(需手动防范)。
- ORM 框架(如 MyBatis/Hibernate)优点:
- 自动映射对象与数据库表,减少 SQL 编写。
- 提供缓存、事务管理等高级功能。
- 选择 JDBC 的场景:
- 高性能要求(如大数据量分页、复杂 SQL 优化)。
- 数据库结构频繁变更,需灵活调整 SQL。
2. MyBatis 缓存机制
题目:
- MyBatis 的一级缓存和二级缓存有什么区别?如何配置和优化二级缓存?
解析:
- 一级缓存:
- SqlSession 级别,默认开启。
- 同一个 SqlSession 中多次查询相同数据时直接从缓存获取。
- 失效条件:执行增删改操作会清空缓存。
- 二级缓存:
- SqlSessionFactory 级别,跨 SqlSession 共享。
- 需手动配置(在
mapper.xml
中启用<cache>
标签)。 - 优化建议:
- 合理设置缓存大小(
size
和timeout
)。 - 对频繁更新的表禁用二级缓存。
- 合理设置缓存大小(
3. Hibernate 的实体状态
题目:
- Hibernate 中的实体对象有哪几种状态?如何将瞬时态(Transient)对象转为持久态(Persistent)?
解析:
- 实体状态:
- 瞬时态(Transient):未与 Session 关联,未持久化。
- 持久态(Persistent):与 Session 关联,受事务管理。
- 脱管态(Detached):已持久化但 Session 关闭。
- 删除态(Removed):标记为删除,事务提交后从数据库移除。
- 瞬时态转持久态的方法:
save()
:插入数据并返回主键。persist()
:与save()
类似,但不返回主键(JPA 规范)。saveOrUpdate()
:根据主键判断是插入还是更新。
二、NoSQL 题目
4. NoSQL 分类与场景
题目:
- NoSQL 数据库分为哪些类型?请列举每类的典型代表及其适用场景。
解析:
类型 | 典型代表 | 适用场景 |
---|---|---|
键值对 | Redis, DynamoDB | 缓存、会话存储、高速读写 |
文档型 | MongoDB, Couchbase | 内容管理、日志分析、JSON 数据 |
列存储 | HBase, Cassandra | 大数据存储、时间序列分析 |
图数据库 | Neo4j, Amazon Neptune | 社交网络、推荐系统、知识图谱 |
5. Redis 与 Memcached 的区别
题目:
- Redis 和 Memcached 有哪些异同?在什么场景下选择 Redis?
解析:
- 相同点:
- 基于内存,提供高速读写。
- 支持分布式部署。
- 不同点:
特性 Redis Memcached 数据类型 字符串、列表、集合、有序集合 仅支持字符串 持久化 支持 RDB/AOF 无持久化 主从复制 支持 不支持 性能 略低(因功能丰富) 更高(轻量级) - 选择 Redis 的场景:
- 需要持久化或复杂数据结构(如缓存购物车、计数器)。
- 要求主从复制或高可用性。
6. CAP 定理与 NoSQL
题目:
- CAP 定理(一致性、可用性、分区容忍性)在 NoSQL 数据库中如何体现?请举例说明其在实际场景中的权衡。
解析:
- CAP 定理:在分布式系统中,最多只能同时满足 一致性(C)、可用性(A) 和 分区容忍性(P) 中的两项。
- NoSQL 的权衡:
- 最终一致性(CP):如 Cassandra(优先一致性),牺牲部分可用性。
- 高可用性(AP):如 MongoDB(优先可用性),容忍短暂不一致。
- 实际场景:
- 电商库存系统:需强一致性(CP),避免超卖。
- 社交网络评论:可接受短暂延迟(AP),优先用户体验。
三、综合应用题
7. 混合数据库架构设计
题目:
- 某电商平台需要实现“订单状态统计”功能,要求实时展示每个用户的订单数量(待支付、已发货、已完成)。请设计数据库方案,并说明选择的 SQL 与 NoSQL 类型及理由。
解析:
- 方案:
- SQL 数据库(MySQL):存储订单核心数据(如订单号、用户 ID、状态)。
- 理由:事务性强,适合 ACID 操作(如订单状态更新)。
- NoSQL 数据库(Redis):缓存实时统计结果(如用户状态计数)。
- 理由:高速读写,适合频繁查询的场景。
- SQL 数据库(MySQL):存储订单核心数据(如订单号、用户 ID、状态)。
- 实现流程:
- 订单状态变更时,更新 MySQL 并同步更新 Redis 缓存。
- 用户访问时,优先从 Redis 获取统计结果;若缓存失效,从 MySQL 查询并重建缓存。
8. NoSQL 性能优化
题目:
- 如何优化 NoSQL 数据库的性能?请列举 5 种常见方法。
解析:
- 硬件优化:使用 SSD 提升 I/O 速度,增加内存以提高缓存命中率。
- 数据模型设计:根据查询模式设计数据结构(如 MongoDB 的嵌套文档)。
- 分布式架构:使用分片(Sharding)分散数据负载(如 MongoDB 分片集群)。
- 查询优化:减少返回字段(投影查询),避免复杂聚合操作。
- 监控与调优:使用监控工具(如 Prometheus + Grafana)跟踪资源使用率,调整分片策略。
四、进阶问题
9. NoSQL 的分布式挑战
题目:
- NoSQL 数据库在哪些场景下可能面临挑战?如何解决?
解析:
- 挑战:
- 数据一致性:最终一致性可能导致读取旧数据。
- 解决方案:使用版本号或乐观锁控制更新。
- 复杂查询:不支持 JOIN,关联查询困难。
- 解决方案:通过冗余存储或应用层处理。
- 运维复杂度:分布式系统的配置和监控更复杂。
- 解决方案:使用自动化运维工具(如 Kubernetes)。
- 数据迁移:从关系型数据库迁移时需重构数据模型。
- 解决方案:分阶段迁移并验证数据一致性。
- 数据一致性:最终一致性可能导致读取旧数据。
10. NoSQL 与 SQL 的混合使用
题目:
- 在哪些场景下可以结合使用 NoSQL 和 SQL 数据库?请举例说明。
解析:
- 混合使用场景:
- 核心业务数据(SQL):
- 用于事务性操作(如订单支付、库存管理)。
- 日志/缓存数据(NoSQL):
- 使用 MongoDB 存储用户行为日志,Redis 缓存高频查询结果。
- 推荐系统(NoSQL + SQL):
- SQL 数据库存储用户标签,Neo4j 分析社交关系,MongoDB 存储推荐结果。
- 核心业务数据(SQL):
- 优势:
- 发挥 SQL 的事务性和 NoSQL 的灵活性与扩展性。
- 通过数据同步(如 Kafka)实现双写一致性。
五、附加题(开放讨论)
11. NoSQL 的未来趋势
题目:
- NoSQL 技术未来的发展方向可能包括哪些方面?
解析:
- 多模型数据库:支持多种数据模型(如 ArangoDB 同时支持文档、图、键值)。
- 增强一致性:通过改进协议(如 Raft)实现更高效的 ACID 特性。
- AI 集成:利用机器学习优化查询计划和数据分布。
- 云原生支持:深度集成云服务(如 AWS DocumentDB、Azure Cosmos DB)。
文档总结
本合集覆盖了 数据库与持久层的核心概念(如 JDBC、MyBatis、Hibernate)、NoSQL 的分类与优化(如 Redis、MongoDB、CAP 定理),以及 混合架构设计 和 进阶问题。通过结合理论与实践,帮助开发者深入理解数据库与 NoSQL 的设计哲学与应用场景,适合用于 Java 面试准备或技术学习。