【问题标题】:Multithreading in SqliteSqlite 中的多线程
【发布时间】:2026-01-27 05:00:01
【问题描述】:

我正在使用 System.data.sqlite 连接到 Sqlite 数据库,根据Sqlite documentation,用户可以通过使用 SQLITE_OPEN_NOMUTEX 标志作为连接字符串的一部分来启用多线程。但是我在接受标志的连接字符串中找不到任何键。是否默认启用?如果不是,我该怎么做?

【问题讨论】:

  • 也就是说,多线程使用似乎是默认的。
  • multi-threade use 是默认但不是多线程模式。 serialized 是默认值,当然它允许以安全的方式进行多线程使用(序列化调用)
  • 我的 C# 代码是线程安全的,或者我正在确保我的 C# 代码的线程安全,但我想在运行时使用 SQLite 的多线程模式,使用连接字符串。我该怎么做?
  • 看来您无法控制它 - 查看公共 SqlLiteConnectionBuilder 属性 - 没有一个允许线程模式。我没有看到任何建议您获得比默认值更多的东西 - 序列化模式,它允许多线程 use 但不允许多线程模式。可能是错的,但我没有看到任何公开的内容......

标签: c# multithreading sqlite


【解决方案1】:

线程模式由编译时间、启动或运行时选项决定。更多细节在这里:

http://www.sqlite.org/threadsafe.html

文档说序列化是默认设置,这意味着您可以从多个线程中使用 - 它会保护您。如果你想要更多的并行性,你可以使用多线程模式。

如果您在多线程模式下使用它,请确保对给定连接的调用是同步的。如果您想要并行工作,请使用多个连接并保护连接。

API 本身通过将 db 对象(连接)作为您按顺序调用的许多函数的参数来暗示这一点。例如,查看您调用以获取错误的这些函数:

int sqlite3_errcode(sqlite3 *db); 
const char *sqlite3_errmsg(sqlite3*);

【讨论】:

  • 我想让它在运行时多线程。如何在 .Net 提供程序中指定它?
  • 我唯一的犹豫是那是 2005 年的帖子。您可能想查看源代码,看看它在做什么。如果默认是多线程的,那么你需要创建多个连接对象,并确保每个连接对象都被序列化。
  • @Anuraj:我刚刚找到了来源。似乎从未明确指定线程模式,并且无法通过托管包装器在运行时对其进行配置。默认仍然设置为序列化。