第一部分:项目概述与需求分析
目标
- 实现一个轻量级、高性能的关系型数据库,全面支持SQL ANSI 92标准。
- 使用Java语言,支持JDBC驱动,兼容主流数据库工具。
- 性能目标:超越主流嵌入式数据库(如H2、SQLite)在嵌入式场景中的表现。
- 支持完整的事务(MVCC实现)和JSON数据类型。
功能需求
- SQL ANSI 92完整支持:
- DDL:CREATE/DROP/ALTER TABLE, CREATE INDEX等。
- DML:INSERT, SELECT, UPDATE, DELETE(包括JOIN、子查询、聚合函数)。
- 查询:WHERE, ORDER BY, GROUP BY, HAVING, UNION等。
- 事务支持:基于MVCC(多版本并发控制)实现ACID。
- JSON支持:存储、查询和操作JSON数据(如JSON_EXTRACT)。
- JDBC驱动:实现标准JDBC接口,支持外部连接。
- SQL ANSI 92完整支持:
非功能需求
- 高性能:优于H2、SQLite,尤其在嵌入式场景下。
- 轻量化:内存占用低,启动快。
- 可移植性:跨平台,无外部依赖。
与主流嵌入式数据库对比
- H2:纯Java实现,支持MVCC和JDBC,性能优秀,但内存占用较高。
- SQLite:C语言实现,轻量但JDBC需额外桥接,JSON支持较弱。
- 本项目优势:纯Java、无依赖、JSON原生支持、性能调优至最优。
第二部分:系统架构设计
模块划分
- JDBC驱动:实现java.sql包的接口(如Driver、Connection、Statement)。
- SQL解析器:解析SQL ANSI 92标准语句,生成AST。
- 查询优化器:基于成本的优化,支持MVCC和索引。
- 执行引擎:高效执行SQL,支持并行处理。
- 存储引擎:内存+文件存储,支持JSON和B+树索引。
- 事务管理器:基于MVCC实现并发控制。
- 元数据管理:存储表结构、索引和JSON字段定义。
技术选型
- Java 17+:利用现代特性(如记录类、密封类)。
- 数据结构:B+树(索引)、RoaringBitmap(高效过滤)、JSON-P(JSON处理)。
- 文件存储:Java NIO + 内存映射文件(高性能I/O)。
架构图(文字描述)
graph TD A[用户输入SQL] --> B[SQL解析器] B -->|生成| C[AST] C --> D[查询优化器] D -->|优化后计划| E[执行引擎] E --> F[存储引擎]
第三部分:核心组件设计
JDBC驱动实现
- 驱动注册:
1 2 3 4 5 6 7 8 9
public class LightweightDriver implements java.sql.Driver { static { DriverManager.registerDriver(new LightweightDriver()); } @Override public Connection connect(String url, Properties info) { return new LightweightConnection(url); } }
- Connection/Statement实现:支持标准SQL执行。
- 驱动注册:
SQL解析器
- 使用ANTLR生成SQL ANSI 92语法树。
- 支持JSON操作:
SELECT JSON_EXTRACT(data, '$.name') FROM users;
。
存储引擎
- 数据存储:支持基本类型(INT, VARCHAR)和JSON。
1 2 3
class Row { Map<String, Object> columns; // 支持JSON对象 }
- 索引:B+树 + RoaringBitmap(高效范围查询)。
- 数据存储:支持基本类型(INT, VARCHAR)和JSON。
事务管理(MVCC)
- 实现多版本并发控制:
- 每行数据带版本号和事务ID。
- 读操作访问可见版本,写操作创建新版本。
1 2 3 4 5
class MVCCRow { Map<String, Object> data; long version; long transactionId; }
- 实现多版本并发控制:
JSON支持
- 使用JSON-P解析和存储JSON。
- 支持查询:
WHERE JSON_EXTRACT(data, '$.age') > 18
。
第四部分:实现SQL ANSI 92核心功能
DDL
- 支持完整表定义,包括约束(PRIMARY KEY, FOREIGN KEY)。
- 示例:
CREATE TABLE users (id INT PRIMARY KEY, data JSON);
。
DML
- SELECT:支持子查询、JOIN、GROUP BY。
- INSERT/UPDATE:支持JSON字段更新。
事务
- MVCC实现:
1 2 3 4 5 6 7
class TransactionManager { long currentTxId; List<MVCCRow> undoLog; void begin() { currentTxId++; } void commit() { /* 持久化版本 */ } void rollback() { /* 恢复undoLog */ } }
- MVCC实现:
第五部分:性能优化
查询优化
- 基于统计信息的代价优化。
- 并行执行:多线程处理JOIN和聚合。
存储优化
- 内存映射文件:减少I/O开销。
- 压缩:对JSON数据使用压缩算法(如GZIP)。
性能对比目标
- 插入速度:优于SQLite。
- 查询速度:优于H2(尤其在JSON查询上)。
第六部分:代码实现示例
JDBC使用
1 2 3 4 5 6 7 8 9
Class.forName("com.xai.LightweightDriver"); Connection conn = DriverManager.getConnection("jdbc:lightweight:db"); Statement stmt = conn.createStatement(); stmt.execute("CREATE TABLE users (id INT, data JSON)"); stmt.execute("INSERT INTO users VALUES (1, '{\"name\": \"Alice\"}')"); ResultSet rs = stmt.executeQuery("SELECT JSON_EXTRACT(data, '$.name') FROM users"); while (rs.next()) { System.out.println(rs.getString(1)); // 输出 "Alice" }
MVCC事务
1 2 3 4
TransactionManager tx = new TransactionManager(); tx.begin(); db.execute("UPDATE users SET data = '{\"name\": \"Bob\"}' WHERE id = 1"); tx.commit();
第七部分:测试与验证
功能测试
- 验证SQL ANSI 92完整性(TPC-H基准测试)。
- 测试JSON查询和MVCC事务。
性能测试
- 对比H2、SQLite:
- 插入10万条JSON记录。
- 查询复杂JOIN和聚合。
- 目标:吞吐量和延迟优于竞品。
- 对比H2、SQLite:
第八部分:扩展与优化
扩展功能
- 支持触发器(TRIGGER)。
- 分布式扩展(未来方向)。
优化方向
- 查询缓存:热点数据缓存。
- SIMD指令:加速向量计算。