2025-11-09
LiteDB
00

背景介绍

在电气自动化系统中,数据存储是至关重要的环节。传统的关系型数据库往往过于复杂,而嵌入式数据库LiteDB以其轻量、高效、无服务器的特点,成为电气自动化领域数据存储的理想选择。

项目结构

C#
App/ ├── Models/ │ ├── DeviceLog.cs │ ├── DeviceConfig.cs │ └── HistoricalData.cs ├── Services/ │ ├── LogService.cs │ ├── ConfigService.cs │ └── DataRecordService.cs └── Program.cs └── DatabaseFactory.cs
2025-11-09
LiteDB
00

并发控制概述

在现代软件开发中,并发控制是确保数据一致性和完整性的关键技术。对于轻量级嵌入式数据库 LiteDB 来说,有效的并发控制机制尤为重要。本文将详细探讨 LiteDB 中的并发控制策略、多线程访问模式以及在多设备数据同步中的应用。

Nuget 安装LiteDB

image.png

LiteDB 并发控制基础

锁机制原理

LiteDB 提供了多种锁定机制来管理并发访问:

C#
using LiteDB; namespace App13 { public class User { public string Name { get; set; } public int Age { get; set; } } internal class Program { // 数据库实例 private static LiteDatabase _database; // 创建一个静态对象作为锁对象 private static readonly object _lock = new object(); static void Main(string[] args) { ExclusiveLockExample(); SharedLockExample(); } // 共享锁:允许多个读取操作同时进行 public static void SharedLockExample() { using (var db = new LiteDatabase(@"MyData.db")) { // 使用共享锁进行读取操作 var collection = db.GetCollection<User>("users"); // 多线程并发读取不会相互阻塞 Parallel.For(0, 10, i => { var users = collection.Find(u => u.Age > 18); Console.WriteLine($"Thread {i} read {users.Count()} users"); }); } } // 排他锁:确保写入操作的原子性 public static void ExclusiveLockExample() { using (var db = new LiteDatabase(@"MyData.db")) { var collection = db.GetCollection<User>("users"); // 使用静态锁对象替代 this lock (_lock) { // 写入操作 var newUser = new User { Name = "张三", Age = 30 }; collection.Insert(newUser); } } } } }

image.png

2025-11-09
LiteDB
00

在现代软件开发中,数据的可靠性和一致性至关重要。每一个数据库操作都潜藏着风险:一个意外的系统崩溃、一个未处理的异常,都可能导致数据的部分损坏或完全丢失。这就是为什么事务管理成为数据库设计中最关键的特性之一。

对于追求轻量级、高效率的开发者来说,LiteDB 是一个令人兴奋的选择。它不仅提供了简单直观的 API,还内置了强大的事务管理机制。本文将深入探索 LiteDB 的事务世界,揭示如何通过精妙的事务控制,为您的应用程序构建坚不可摧的数据保护屏障。

无论您是一名经验丰富的开发者,还是刚开始接触数据库编程的新手,这篇文章都将为您呈现 LiteDB 事务管理的方方面面:从基本的 ACID 特性,到复杂的事务处理模式,我们将带您穿越数据一致性的迷雾,直达技术的璀璨之巅。

事务的ACID特性

事务(Transaction)是数据库管理系统中确保数据一致性和完整性的关键机制。在 LiteDB 中,事务遵循经典的 ACID 特性:

A - 原子性(Atomicity)

  • 事务中的所有操作要么全部成功,要么全部回滚
  • 保证了数据操作的不可分割性

C - 一致性(Consistency)

  • 事务执行前后,数据库的状态必须保持一致
  • 防止事务导致数据库处于不合法的状态

I - 隔离性(Isolation)

  • 并发执行的事务相互隔离,互不影响
  • 防止多个事务同时操作同一数据时产生冲突

D - 持久性(Durability)

  • 事务一旦提交,其修改将永久保存
  • 即使系统发生故障,已提交的事务不会丢失

LiteDB 显式事务管理

Nuget 安装LiteDB

image.png

2025-11-09
LiteDB
00

索引的重要性

在 LiteDB 中,索引是提升查询性能的关键机制。正确的索引策略可以显著减少查询时间,尤其是在处理大规模数据集时。

Nuget 安装LiteDb

image.png

索引创建示例

User类

C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace App11 { public class User { public int Id { get; set; } public string Username { get; set; } public string Email { get; set; } public int Age { get; set; } } }
C#
using LiteDB; namespace App11 { internal class Program { static void Main(string[] args) { using (var db = new LiteDatabase(@"MyDatabase.db")) { // 获取用户集合 var users = db.GetCollection<User>("users"); // 创建单字段索引 users.EnsureIndex(x => x.Username); // 创建复合索引 users.EnsureIndex(x => new { x.Username, x.Email }); // 唯一索引,确保字段值唯一 users.EnsureIndex(x => x.Email, unique: true); // 插入10条测试记录 var testUsers = new List<User> { new User { Id = 1, Username = "john_doe", Email = "john@example.com", Age = 25 }, new User { Id = 2, Username = "jane_smith", Email = "jane@example.com", Age = 28 }, new User { Id = 3, Username = "mike_wilson", Email = "mike@example.com", Age = 32 }, new User { Id = 4, Username = "sarah_jones", Email = "sarah@example.com", Age = 24 }, new User { Id = 5, Username = "david_brown", Email = "david@example.com", Age = 35 }, new User { Id = 6, Username = "emma_davis", Email = "emma@example.com", Age = 27 }, new User { Id = 7, Username = "alex_taylor", Email = "alex@example.com", Age = 31 }, new User { Id = 8, Username = "lisa_anderson", Email = "lisa@example.com", Age = 29 }, new User { Id = 9, Username = "tom_miller", Email = "tom@example.com", Age = 33 }, new User { Id = 10, Username = "anna_white", Email = "anna@example.com", Age = 26 } }; // 插入记录 users.InsertBulk(testUsers); // 示例查询操作 // 查找所有年龄大于30的用户 var over30 = users.Find(x => x.Age > 30).ToList(); Console.WriteLine($"Over 30: {string.Join(", ", over30.Select(x => x.Username))}"); // 按用户名查找 var userJohn = users.FindOne(x => x.Username == "john_doe"); Console.WriteLine($"John Doe: {userJohn.Email}"); // 使用复合索引查找 var userByEmailAndUsername = users.FindOne(x => x.Username == "emma_davis" && x.Email == "emma@example.com"); Console.WriteLine($"Emma Davis: {userByEmailAndUsername.Age}"); Console.ReadKey(); } } } }

image.png

2025-11-09
LiteDB
00

全文检索是现代应用程序中非常重要的搜索技术,它允许用户快速、精确地在大量文本数据中找到相关信息。在设备日志管理系统中,高效的全文检索尤为关键。

LiteDB 全文检索技术

基本全文检索实现

C#
// 定义设备日志实体 public class DeviceLog { public int Id { get; set; } public DateTime Timestamp { get; set; } public string DeviceId { get; set; } public string LogLevel { get; set; } public string Message { get; set; } }

准备基础数据

C#
namespace App10 { internal class Program { static void Main(string[] args) { var logService = new LogSearchService("devicelogs.db"); // 添加测试记录 var testLogs = new List<DeviceLog> { new DeviceLog { DeviceId = "DEV001", Timestamp = DateTime.Now.AddHours(-2), LogLevel = "INFO", Message = "设备启动正常,开始运行" }, new DeviceLog { DeviceId = "DEV001", Timestamp = DateTime.Now.AddHours(-1), LogLevel = "WARNING", Message = "网络连接不稳定,正在重试" }, new DeviceLog { DeviceId = "DEV002", Timestamp = DateTime.Now.AddMinutes(-45), LogLevel = "ERROR", Message = "设备温度过高,紧急停机" }, new DeviceLog { DeviceId = "DEV003", Timestamp = DateTime.Now.AddMinutes(-30), LogLevel = "INFO", Message = "系统更新完成,版本号v2.1.0" }, new DeviceLog { DeviceId = "DEV002", Timestamp = DateTime.Now.AddMinutes(-25), LogLevel = "ERROR", Message = "网络连接异常,无法访问远程服务器" }, new DeviceLog { DeviceId = "DEV001", Timestamp = DateTime.Now.AddMinutes(-20), LogLevel = "INFO", Message = "数据备份完成,存储空间充足" }, new DeviceLog { DeviceId = "DEV004", Timestamp = DateTime.Now.AddMinutes(-15), LogLevel = "WARNING", Message = "内存使用率达到85%,建议优化" }, new DeviceLog { DeviceId = "DEV003", Timestamp = DateTime.Now.AddMinutes(-10), LogLevel = "ERROR", Message = "传感器数据异常,需要校准" }, new DeviceLog { DeviceId = "DEV004", Timestamp = DateTime.Now.AddMinutes(-5), LogLevel = "INFO", Message = "设备自检完成,运行正常" }, new DeviceLog { DeviceId = "DEV002", Timestamp = DateTime.Now, LogLevel = "WARNING", Message = "电源电压波动,已切换备用电源" } }; // 将测试记录插入数据库 logService.BatchInsert(testLogs); Console.ReadKey(); } } }

image.png