使用 SQLite3 实现生产者/消费者的正确方法是什么?


What's the right way to implement producer/consumer w/ SQLite3?

如何偶尔写入具有频繁读取器的sqlite数据库? 我正在使用PHP,但这并不重要。 我知道 query() 会返回 SQLITE_BUSY ,我可以再试一次,我可以打电话给busyTimeout提供帮助,但我希望有一种内置的方法可以告诉数据库自行等待。 现在,我正在使用:

function wait_query_db($db, $query) {
    do {
        $db->busyTimeout(1000);
        $result = @$db->query($query);
    } while ($db->lastErrorCode() == SQLITE_BUSY);
    return $result;
}

busyTimeout(或等效的PRAGMA busy_timeout告诉数据库等待的内置方法。

如果要等待更长时间,则应使用更大的超时。

如果您的 PHP 足够新,至少具有 SQLite 3.7,并且您的数据库不是通过网络文件系统访问的,则应考虑启用预写日志记录,这可以防止读取器和写入器相互阻塞。

没有"内置"方法。增加繁忙超时。您可以通过执行以下命令将其设置为连接本身:

PRAGMA busy_timeout = milliseconds

(自SQLite 3.7.15起可用)