1. 引言
在第一篇中,我们明确了项目的目标:构建一个高性能、轻量级的嵌入式数据库,支持SQL ANSI 92标准、JDBC驱动、MVCC事务和JSON功能,并超越H2和SQLite的性能。本篇将设计系统的整体架构,划分功能模块,确定技术选型,并为实现提供清晰的结构化指导。
2. 模块划分
系统采用模块化设计,分为以下核心组件:
- JDBC驱动(JDBC Driver)
- 功能:实现标准JDBC接口,桥接外部客户端与数据库内核。
- 职责:接收SQL语句,返回查询结果,支持连接管理和事务控制。
- SQL解析器(SQL Parser)
- 功能:将SQL语句解析为抽象语法树(AST)。
- 职责:支持SQL ANSI 92语法,包括JSON相关操作。
- 查询优化器(Query Optimizer)
- 功能:根据统计信息和索引优化执行计划。
- 职责:选择最低成本的查询路径,提升性能。
- 执行引擎(Execution Engine)
- 功能:执行SQL操作,包括DDL、DML和事务。
- 职责:协调存储引擎和事务管理器,处理并行执行。
- 存储引擎(Storage Engine)
- 功能:管理数据存储和索引,支持内存和文件模式。
- 职责:实现高效的读写操作,支持JSON和B+树索引。
- 事务管理器(Transaction Manager)
- 功能:基于MVCC实现事务一致性。
- 职责:管理版本控制、并发事务和日志。
- 元数据管理(Metadata Manager)
- 功能:存储和管理表结构、索引和JSON字段定义。
- 职责:提供元数据查询和更新接口。
3. 技术选型
为实现高性能和轻量化目标,选择以下技术:
- 开发语言:Java 17
- 理由:跨平台,支持现代特性(如记录类、密封类),与JDBC无缝集成。
- SQL解析:ANTLR v4
- 理由:强大的语法解析工具,支持SQL ANSI 92标准。
- 数据结构:
- B+树:用于索引,支持高效范围查询。
- RoaringBitmap:用于快速过滤和集合操作。
- HashMap:内存表存储。
- 文件存储:Java NIO + 内存映射文件(Memory-Mapped Files)
- 理由:高性能I/O,减少系统调用开销。
- JSON处理:JSON-P(JSR 374)
- 理由:轻量级,Java标准,适合嵌入式场景。
- 并发控制:MVCC + 自定义线程池
- 理由:MVCC提供高效事务并发,自定义线程池优化资源使用。
4. 系统架构图
以下是系统的详细架构图,使用Mermaid语法展示模块间的交互:
graph TD
A[客户端<br>(JDBC/SQL工具)] -->|JDBC URL| B[JDBC驱动]
B -->|SQL语句| C[SQL解析器]
C -->|AST| D[查询优化器]
D -->|执行计划| E[执行引擎]
E -->|操作请求| F[存储引擎]
E -->|事务控制| G[事务管理器<br>(MVCC)]
F -->|元数据查询| H[元数据管理]
F -->|数据读写| I[内存存储]
F -->|数据持久化| J[文件存储<br>(NIO+MMF)]
G -->|版本管理| F
H -->|表结构| F
- 流程说明:
- 客户端通过JDBC驱动发送SQL语句。
- SQL解析器生成AST,交由查询优化器分析。
- 执行引擎根据优化后的计划调用存储引擎和事务管理器。
- 存储引擎操作内存或文件存储,元数据管理提供表结构支持。
- 事务管理器通过MVCC确保并发一致性。
5. 核心设计要点
5.1 JDBC驱动
- 实现
java.sql.Driver
、Connection
、Statement
等接口。 - 支持连接池和配置参数(如内存模式/文件模式)。
5.2 SQL解析器
- 使用ANTLR定义SQL ANSI 92语法规则。
- 支持扩展语法(如JSON函数),生成结构化AST。
5.3 查询优化器
- 基于统计信息(如行数、索引选择性)优化JOIN顺序和WHERE条件。
- 支持规则优化(如谓词下推)和成本优化。
5.4 执行引擎
- 实现操作符模型(如扫描、过滤、连接)。
- 支持并行执行,使用线程池处理大查询。
5.5 存储引擎
- 内存模式:HashMap存储表数据,B+树维护索引。
- 文件模式:内存映射文件存储表和日志,JSON数据压缩存储。
- 索引:B+树支持主键和二级索引,RoaringBitmap加速过滤。
5.6 事务管理器
- MVCC实现:
- 每行数据附加版本号和事务ID。
- 读操作访问可见版本,写操作创建新版本。
- 日志支持:WAL(Write-Ahead Logging)确保持久性。
5.7 元数据管理
- 存储表结构、列定义和索引信息。
- 使用内存缓存+文件持久化方式。
6. 性能优化策略
- 内存使用:尽量减少对象分配,使用原始类型和紧凑数据结构。
- I/O优化:内存映射文件减少拷贝,批量写入降低开销。
- 并发性:MVCC避免锁竞争,线程池支持并行查询。
- 索引效率:B+树和RoaringBitmap组合,优化范围查询和集合操作。
7. 与H2/SQLite的架构对比
- H2:模块化类似,但查询优化较复杂,内存占用高。
- SQLite:单线程架构,文件存储强但并发弱。
- 本项目:轻量模块化,MVCC+并行执行,兼顾内存和文件性能。
8. 下一步展望
下一篇文章将聚焦“JDBC驱动实现”,详细设计和编码JDBC接口,并结合SQL解析器展示端到端执行流程。随后将逐步实现存储引擎、MVCC事务和JSON支持。
总结
第二篇设计了系统的整体架构,划分了七大模块,明确了技术选型和高性能设计要点。通过Mermaid图展示了模块交互流程,为后续实现奠定了基础。与H2和SQLite的对比进一步验证了架构的合理性。下一篇文章将进入具体实现阶段。