LiteDB 是什么,适合什么场景
LiteDB 是一个轻量级、零配置、单文件的 NoSQL 嵌入式数据库,专为 .NET 设计。它不依赖服务进程,不需安装,直接通过 NuGet 引用
LiteDB包就能用。适合桌面应用、IoT 设备、CLI 工具、原型开发等需要本地持久化但不想搭 MongoDB 或 SQLite(关系型)的场景。 不适合高并发写入、复杂事务、多用户共享访问 支持 BsonDocument 和强类型 POCO,自动序列化/反序列化 默认使用
LiteDatabase单例模式打开文件,同一进程内多个实例可能引发文件锁冲突
如何初始化并插入一条数据
用
LiteDatabase打开一个 .db 文件路径,获取
LiteCollection<t></t>后调用
Insert即可。注意:路径必须可写,且目录存在(LiteDB 不自动创建父目录)。
using var db = new LiteDatabase(@"C:\data\users.db");
var users = db.GetCollection<User>("users");
users.Insert(new User { Id = ObjectId.NewObjectId(), Name = "Alice", Age = 30 });
ObjectId是 LiteDB 自带的主键类型,推荐作为
_id字段(类中字段名必须是
_id或加
[BsonId]特性) 如果没定义
_id,LiteDB 会自动生成并写入,但强类型建议显式声明 插入后不调用
db.Dispose()或 using 会导致文件句柄未释放,后续打开失败
查询数据时为什么查不到,常见错误有哪些
最常踩的坑是字段名大小写不一致或未正确映射。LiteDB 默认按属性名(非字段名)映射,且区分大小写;若类中用
public string name { get; set; }(小写),而查询用 name == "Alice",能查到;但若实际存的是
Name(PascalCase),而查询写成
name == "Alice"就为空。 查询必须用 LINQ 表达式,
Find(x => x.Name == "Alice")是对的,
Find("Name == 'Alice'")(字符串查询)已弃用且不推荐
FindAll()返回所有,但大数据集慎用,无索引时是全表扫描 没建索引的字段做
Where条件,性能随数据量线性下降 若实体类有只读属性(
get无
set),LiteDB 默认跳过,不会报错但也不存值
如何安全地在多线程中使用 LiteDB
LiteDB 的
LiteDatabase实例不是线程安全的。官方明确要求:每个线程应有自己的
LiteDatabase实例,或复用同一个实例但确保串行访问(比如加锁)。 ✅ 推荐方式:每次操作都新建
LiteDatabase(开销极小,底层有连接池优化) ❌ 错误方式:全局静态
LiteDatabase实例被多个线程同时调用
Insert/
Find若必须复用,可用
lock包裹集合操作,但会牺牲并发吞吐 长期运行的服务中,避免让
LiteDatabase实例存活过久(如 static),因内部缓存和文件句柄可能累积
LiteDB 看似简单,但字段映射规则、线程模型、索引缺失导致的静默性能退化,这三点最容易在上线后才暴露。
