PDO Sqlite阻塞与多个写


PDO Sqlite blocking with multiple writes

我正在制作一个简单的日志类,使用php的pdo扩展将消息记录到sqlite数据库。日志记录正确,但间歇性缓慢。当我加载页面时,它会快速记录日志,但如果几乎同时加载第二个页面,它有时会挂起。

查看XDEBUG中的概要文件,看起来准备和执行语句有时花费的时间很少,但有时花费的时间更长。当它们较长时,它们总是非常接近秒的倍数(例如1000,1001或2001毫秒)。

我尝试了不同的组合使用开始事务或不PDO::ATTR_PERSISTENT。

有什么建议吗?

这是SQLite的主要缺点。

数据库具有锁机制以防止在执行请求时数据/模式发生更改。大多数数据库服务器将在RAM中工作,然后以线程方式将数据持久化到磁盘(即:写入RAM,返回响应,然后写入磁盘)。您一定已经知道,写入内存要比写入磁盘快无数倍。由于SQLite直接写入磁盘,因此它首先锁定数据库,然后写入,然后释放锁。写(到磁盘)部分比普通数据库服务器(例如:MySQL, PostgreSQL等)花费的时间要长得多,导致在短延迟内执行多个查询时响应时间长。

我发现的解决方案是使用内存数据库(即::memory:)并定期转储到磁盘。这种方法的主要缺点是磁盘上的数据不一定是最新的数据(因为实际的实时数据存储在内存中)。

没有神奇的解决方案,这是SQLite的根本"问题"。如果您计划在一个数据库上运行多个并发写操作,那么您应该考虑使用实际的数据库服务器。