繁体   English   中英

PDO Sqlite 因多次写入而阻塞

[英]PDO Sqlite blocking with multiple writes

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

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

我已经尝试过使用 begin transaction 与 PDO::ATTR_PERSISTENT 的不同组合。

有什么建议么?

这是 SQLite 的主要缺点。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM