4

我计划将 SQLite 和 Peewee (ORM) 用于轻型内部 Web 服务(每秒<20 个请求)。Web 服务可以处理多个线程上的多个同时请求。在每次请求期间,数据库都将被读取和写入。这意味着我需要具备并发读取和写入的能力。如果数据在读取和写入之间发生变化,则对这个应用程序无关紧要。

SQLite FAQ说允许并发读取,但来自多个线程的并发写入需要获取文件锁。我的问题是:Peewee 是否会为我处理这种锁定,或者我需要在我的代码中做些什么来使这成为可能?

Peewee 数据库对象在线程之间共享。我认为这意味着数据库连接也是共享的。

我找不到 Peewee 的具体答案,所以我在这里问。

4

2 回答 2

4

Sqlite 是进行锁定的,虽然我可以看出你可能会感到困惑——FAQ 的措辞有点模棱两可:

当任何进程想要写入时,它必须在其更新期间锁定整个数据库文件。但这通常只需要几毫秒。其他流程只是等待作者完成,然后继续他们的业务。其他嵌入式 SQL 数据库引擎通常只允许单个进程一次连接到数据库。

因此,如果您有两个线程,每个线程都有自己的连接,并且一个获取写锁,另一个线程必须等待锁被释放才能开始写入。

查看 pysqlite,默认的繁忙超时看起来是 5 秒,因此第二个线程应该等待最多 5 秒,然后再引发OperationalError.

另外,我建议用threadlocals=True. 这将存储每个线程的连接。

于 2014-02-22T02:59:49.873 回答
1

考虑在 1 个异步进程中运行所有写入操作。这使得当今的 Javascript 服务器编程如此著名(尽管这个想法的了解要长得多)。它只需要你对回调的异步编程概念有点熟悉:

对于 SQLITE:

对于任何数据库。

考虑在 python 中编写自己的瘦异步处理程序,如这里解决的那样,例如 SQLAlchemy + Requests Asynchronous Pattern 我建议您使用最后一种方法,因为这可以让您获得更多的代码可移植性、控制、独立于后端数据库引擎和可扩展性。

于 2014-04-08T08:51:55.157 回答