2

我想使用 SQLite 作为 WCF 服务日志记录的数据库后端。一切看起来都不错,但是如何从真实系统中提取数据库日志文件并且不锁定数据库以检查/分析日志?这个系统似乎负载很大,每次我尝试获取数据库日志文件时,它都会被锁定。

4

3 回答 3

0

SQLite 允许多个进程/应用程序打开同一个数据库文件以进行读写(写入时涉及一些锁定,但这并不常见)。

您应该能够让日志记录过程不断将新行记录到数据库中,同时让卸载/提取过程将旧行复制到其他位置。

但是,如果您不应该在数据库打开时使用标准复制功能将其复制为文件,因为它很可能会损坏它(在 Windows 上,由于严格的锁定,它甚至可能是不可能的)。

相反,让卸载过程使用标准 SQLite API(或一些支持 SQLite 的脚本语言)连接到数据库,使用该 API 读取行并在其他地方创建该数据的副本,例如在另一个 SQLite 数据库或大型“真实”SQL 数据库中,例如MySQL、Postgres 或 MSSQL(如果愿意,也可以在文本文件中)。

于 2012-12-21T03:57:08.740 回答
0

使用 SQLite 的在线备份API 来提取数据,而无需锁定数据库。

于 2012-12-21T05:12:17.273 回答
0

您现在可以使用 SQLite 的预写日志记录模式来启用 SQLite 数据库同时读取和写入。

使用 WAL 代替回滚日志有优点和缺点。优点包括:

  1. 在大多数情况下,WAL 明显更快。
  2. WAL 提供了更多的并发性,因为读取器不会阻塞写入器,写入器不会阻塞读取器。读和写可以同时进行。
  3. 使用 WAL 的磁盘 I/O 操作往往更具顺序性。
  4. WAL 使用更少的 fsync() 操作,因此在 fsync() 系统调用被破坏的系统上不易受到问题的影响。
于 2020-01-07T17:02:09.490 回答