赞
踩
今天看到微信团队的一篇文章,说是自家的开源的终端数据库WCDB进行了重大升级
原文章在这里,感兴趣的朋友们可以围观一下:《五年沉淀,微信全平台终端数据库WCDB迎来重大升级》
wcdb数据库的新版本提供了更丰富的开发语言支持,更强大的SQL表达能力,更安全的数据存储能力,更灵活的数据扩展能力,更细致的性能优化能力等。今天我们来看看到底是怎么个事儿
WCDB是微信团队开源的一款基于SQLite的终端数据库。它的特点包括:
支持多种开发语言:WCDB支持C++、Java、Kotlin、Swift和ObjC这五种主要的终端开发语言,覆盖了Android、iOS、Windows、macOS和Linux这五大终端平台。
集成查询:WCDB提供了Winq(WCDB Integrated Query),使得开发者可以使用原生语法编写任意SQL,告别字符串拼接的胶水代码。
数据库备份与修复:WCDB推出了全新的数据备份和修复方案,大幅提升了数据修复率,同时将数据备份的性能消耗降至可忽略不计。
数据迁移和数据压缩:WCDB提供了数据迁移和数据压缩这两个新功能,让开发者仅通过简单的配置,就能高效处理复杂业务中的数据过度聚集和数据过度膨胀这两大难题。
FTS5优化:WCDB对SQLite的FTS5组件进行了优化,重新设计了FTS5分词器,并丰富了分词器的能力,还支持了拼音搜索。
可中断事务:WCDB支持可中断事务,让一系列DB操作尽量保持在一个事务中执行,同时能够及时响应主线程的阻塞事件,避免了主线程的卡顿问题。
数据安全性:WCDB采用了全新的数据备份方案、修复方案等,保障数据的安全性。
性能优化:WCDB在数据库读写、数据迁移、数据压缩等方面进行了性能优化,提高了数据库操作的效率。
https://github.com/Tencent/wcdb
更丰富的开发语言支持:
更强大的SQL表达能力:
database.query("SELECT * FROM orders WHERE amount > ?", [minAmount]);
这样的代码不仅易于理解,而且减少了出错的可能性。更安全的数据存储能力:
更灵活的数据扩展能力:
更细致的性能优化能力:
// C++
database.insertObjects<Sample>(Sample(1, "text"), myTable);
database.updateRow("text2", WCDB_FIELD(Sample::content), myTable, WCDB_FIELD(Sample::id) == 1);
auto objects = database.getAllObjects<Sample>(myTable, WCDB_FIELD(Sample::id) > 0);
database.deleteObjects(myTable, WCDB_FIELD(Sample::id) == 1);
// Java
database.insertObject(new Sample(1, "text"), DBSample.allFields(), myTable);
database.updateValue("text2", DBSample.content, myTable, DBSample.id.eq(1));
List<Sample> objects = database.getAllObjects(DBSample.allFields(), myTable, DBSample.id.gt(0));
database.deleteObjects(myTable, DBSample.id.eq(1));
// Kotlin
database.insertObject<Sample>(Sample(1, "text"), DBSample.allFields(), myTable)
database.updateValue("text2", DBSample.content, myTable, DBSample.id.eq(1))
val objects = database.getAllObjects<Sample>(DBSample.allFields(), myTable, DBSample.id.gt(0))
database.deleteObjects(myTable, DBSample.id.eq(1))
// Swift
try database.insert(Sample(id:1, content:"text"), intoTable: myTable)
try database.update(table: myTable,
on: Sample.Properties.content,
with: "text2"
where:Sample.Properties.id == 1)
let objects: [Sample] = try database.getObjects(fromTable: myTable,
where: Sample.Properties.id > 0)
try database.delete(fromTable: myTable where: Sample.Properties.id == 1)
// Objc
[database insertObject:sample intoTable:myTable];
[database updateTable:myTable
setProperty:Sample.content
toValue:@"text2"
where:Sample.id == 1];
NSArray* objects = [database getObjectsOfClass:Sample.class
fromTable:myTable
where:Sample.id > 0];
[database deleteFromTable:myTable where:Sample.id == 1];
首先,WCDB会对迁移的表进行配置,包括新表和旧表的字段、约束、索引等信息。新表的字段可以是旧表字段的子集,但不要求两者都有相同的约束和索引。新旧表可以有或者没有rowid,也可以有不同的主键。
WCDB支持将未加密的数据库迁移到加密的数据库,或者将已加密的数据库重加密。还可以通过配置迁移的表来筛选需要迁移的部分数据,实现将一张表的数据拆分到多张表的效果,或者清理冗余数据。
在数据迁移过程中,WCDB会在子线程中每隔2秒花10毫秒执行一次数据迁移,直到数据迁移完整。如果需要加快迁移速度,WCDB也提供了手动执行迁移的接口。
为了减少数据迁移对业务逻辑的影响,WCDB采用了兼容旧表和新表的方案。在迁移过程中,业务逻辑可以继续使用旧表进行开发,而WCDB会自动处理新旧表之间的兼容问题。
WCDB还提供了一种无感知的数据迁移方案,即在执行数据库操作请求时,会先对其使用的数据库句柄进行迁移配置,然后检测旧表是否存在。如果旧表不存在,说明迁移已经完成,直接执行SQL。如果旧表存在,则创建一个temp view,用于后续的兼容。WCDB会预处理数据库的操作请求,修改SQL,再进行真正的执行。这个预处理过程可以确保业务逻辑在迁移过程中不受影响。
在WCDB 1.0中,备份和修复方案主要是针对SQLite数据库的页码进行备份,以解决数据库损坏后数据丢失的问题。然而,这种方案对于磁盘损坏导致的大面积数据丢失情况修复效果并不理想。
在新版WCDB中,备份和修复方案得到了重大升级。除了备份master表,还增加了备份普通表的表名到其叶子页页号和crc校验值的映射。这样一来,修复的时候可以根据页号直接找到普通表的数据,校验crc值未变,即可确认数据没有损坏或变更,从而将未损坏的数据完整恢复到新数据库。此外,还优化了备份性能,使得平均备份耗时仅为63ms,即便是大到10G的DB,备份耗时也不到0.9秒。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。