基于SQLite的终端数据库-WCDB
2024-04-09 17:16:51 阿炯

WCDB (WeChat Database) 是微信团队基于 SQLite 开发的终端数据库。自 2017 年 6 月开源以来,它在业界得到了广泛认可并被大量应用,迄今已经推出了十多个版本。在这个过程中,WCDB 一直保持良好的向后兼容性,不断完善原有接口的细节并添加新功能。其做为一个易用、高效、完整的移动数据库框架,基于 SQLite 和 SQLCipher 开发,在微信中应用广泛,且支持在 C++、Java、Kotlin、Swift、Objc 五种语言环境中使用。主体采用C/C++开发并在3类的BSD协议下授权使用。


微信作为国内乃至全球范围内使用数据库最频繁的 App,其内部涉及上百种不同业务的数据库,存储的消息条数可达百万乃至千万级别。这种庞大的数据量和日益丰富的应用场景,给 WCDB 带来了不断更新的需求和挑战,原有的代码框架逐渐难以应对。因此,自 2019 年起,微信团队决定放弃接口的向后兼容性,全力打造一个更加强大的新版 WCDB。经过多次迭代,WCDB 的接口层和核心逻辑层已经得到了全面改进,同时也积累了许多新功能。

特性

高效性
WCDB 基于 SQLite,并深入其源码进行了性能优化,以适配移动终端的场景。同时,对于常用且性能消耗较大的场景,如批量插入等,也做了针对性的优化。 在多线程方面,WCDB 不仅可以安全地在任意线程进行数据库操作,且其内部会智能地根据操作类型调配资源,使其能够并发执行,进一步提升效率。

完整性
WCDB 总结实践中常见的问题,为数据库开发提供更完整、全面的使用体验:
加密。基于 SQLCipher 的加密机制,为数据安全提供保障。
全文搜索。WCDB 提供简单易用的全文搜索接口,并包含适配多种语言的分词器,使得数据搜索更精准。
反注入。内建在语言集成查询中的反注入机制,可以避免第三方从输入框注入 SQL,进行预期之外的恶意操作。
字段升级。数据库模型与类定义绑定,使得字段的增加、删除、修改都与类变量的定义保持一致,不需要开发者额外地管理字段的版本。
损坏修复。修复工具可以在系统错误、磁盘故障等情况下,尽最大限度地将损坏的数据找回并导出。
数据迁移。WCDB 支持通过简单的配置将数据表迁移到其他数据库,而且让开发者可以以迁移已经完成为假定前提 进行开发,无需关心迁移的中间状态和进度。
数据压缩。WCDB 支持通过简单的配置来使用 Zstd 压缩数据表中的部分字段的内容。配置后,开发者不会感知到数据加解压的细节,而且 WCDB 会自动压缩存量数据。

兼容性
WCDB 支持 C++、Java、Kotlin、Swift、Objc 五种语言进行开发,但是这五种语言在底层是共享同一套逻辑的,整体架构如下图所示:


2024年4月,微信团队宣布将迎来重大升级的新版本 WCDB 进行开源,主要变化及更新包括:
更丰富的开发语言支持:新增支持了 C++,完整支持了 Java 和 Kotlin 语言的 ORM,覆盖更多终端平台;
更强大的 SQL 表达能力:对 Winq 进行了重写、强化等;
更安全的数据存储能力:全新的数据备份方案、修复方案等;
更灵活的数据扩展能力:数据迁移、数据压缩等;
更细致的性能优化能力:FTS5 优化、可中断事务等。

微信团队介绍称,WCDB 1.0 版本支持 Objective-C、Swift、Java 三种开发语言,但是三种语言的 WCDB 除了共用同一个版本的 SQLite 和共用同一套备份修复逻辑,其他代码都是独立开发的。随着 WCDB 不断迭代,WCDB 的很多新能力都是在 ObjC 版本上开发完成和上线验证,Swift 和 Java 版本基本处于停止迭代的状态,他们之间的差异也越来越大。在理想的状态下,不同语言版本的 WCDB 应该拥有同样的能力,但是如果把 ObjC 版本的新逻辑重新在 Swift 和 Java 上实现一遍,不仅工作量大,还容易出错,需要再次上线验证,不太现实。

幸运的是,ObjC 版本的 WCDB 的核心逻辑都是用 C++ 实现的,ObjC 只是用来实现接口层的逻辑。很多支持多种开发语言的库都是使用 C++ 语言来实现核心逻辑,其他语言只是用来实现接口层,比如很热门的客户端 NoSQL 数据库组件 realmDB 就是如此。WCDB 也可以按照这个思路来设计,这样 ObjC 版本的 WCDB 只需小幅调整,将核心逻辑完全改用 C++ 来实现,Swift 和 Java 通过桥接方法来接入 C++ 核心逻辑。

此外,为了充分支持微信各端不同场景的数据库开发需求,WCDB 还扩展支持了 C++ 和 Kotlin,这样就完整覆盖了现在终端开发的主流语言。在这种代码架构下,不同语言的 WCDB 可以按需集成到同个项目中,有利于节省代码和减少包大小,还可以避免不同语言接口逻辑的冲突,甚至使用不同语言的接口来使用同一个 DB 都不用担心有任何逻辑冲突。

在接口层面,新版 WCDB 全面支持了 C++、Java、Kotlin、Swift 和 ObjC 这五种主要的终端开发语言,覆盖了 Android、iOS、Windows 和 Linux 这四大终端平台。同时,微信还对 Winq 进行了重写和强化,使开发者能够在各种语言中使用原生语法编写任意 SQL。

在功能层面,新版 WCDB 推出了全新的数据备份和修复方案,提升了数据修复率,同时将数据备份的性能消耗降至可忽略不计。

另外微信还重点推出了数据迁移和数据压缩这两个新功能,让开发者通过简单的配置,就能处理复杂业务中的数据过度聚集和数据过度膨胀这两大难题。新版 WCDB 还推出了 FTS5 优化和可中断事务等新特性,使开发者在特定场景下可以实现更极致的性能优化。

最新版本:2.1


项目主页:https://github.com/Tencent/wcdb/