【问题标题】:Avoiding locked SQLite database timeouts with PHP/PDO使用 PHP/PDO 避免锁定 SQLite 数据库超时
【发布时间】:2011-08-31 19:17:58
【问题描述】:

我目前正在尝试修复 issue in Drupal core's issue queue 与有人在执行搜索索引时访问站点时发生的超时有关,这是一个相当密集的写入操作,通常发生在调用 cron 命令时(所以它很可能发生在现场网站上,同时公众仍然可以访问)。它源于 SQLite 对写入的锁定,这通常不是问题,但在这种情况下,因为执行此索引会大大增加连接在等待锁定释放时超时的可能性。

答案似乎是增加驱动程序等待锁释放的时间。在 PHP 中,这应该可以通过将 PDO::ATTR_TIMEOUT 选项设置为等待锁定的秒数来实现。然而,这似乎并没有真正起作用。无论传递什么值,都会发生超时。但是,我找不到任何提及它在互联网上其他任何地方都不起作用的信息,所以只有我们吗?有没有其他人在尝试增加 SQLite 的超时时间时遇到问题?是否有其他方法可以避免此问题发生?

【问题讨论】:

  • 对比留言簿/博客更复杂的网站使用 SQLite 并不是一个好主意。您应该转移到另一个数据库引擎或使用谷歌自定义搜索引擎进行网站搜索。
  • 我没有与一个可以做出类似决定的网站合作。我正在尝试解决广泛使用的内容管理系统 Drupal 的核心问题。从系统中删除 SQLite 支持,或者告诉每个人使用 Google 来满足他们的搜索需求,既不可能也不切实际。并且为了记录,在很多情况下,SQLite 是一个非常好的站点选择;例如,获得大量匿名流量和/或托管在内存有限的 VPS 帐户上。
  • 您找到解决方案了吗?我在使用 PHP5 和 SQlite3 时遇到了类似的问题。
  • 不,抱歉。该错误仍然突出。 =/

标签: php sqlite pdo


【解决方案1】:

我已经设法通过使用来缓解这种情况

PRAGMA temp_store=MEMORY; PRAGMA journal_mode=MEMORY; 

并在写作时使用事务。它不会完全解决它,但它会让你的写入速度更快,特别是如果它是一堆同时完成的更新/插入。

【讨论】:

  • 我不确定将 journal_mode 设置为 MEMORY 是个好主意。这是 sqlite.org 不得不说的: MEMORY 日志模式将回滚日志存储在易失性 RAM 中。这节省了磁盘 I/O,但以牺牲数据库安全性和完整性为代价。如果在设置 MEMORY 日志模式时使用 SQLite 的应用程序在事务中崩溃,那么数据库文件很可能会损坏。
【解决方案2】:

是否可以在执行搜索索引时进入只读状态? (只读比超时好...)

如果是这样,我建议这样做:

  • 在应用程序级别(例如drupal的核心代码),以友好的方式阻止所有写入查询
  • 复制数据库文件
  • 对复制的文件执行搜索索引,主文件未锁定
  • 用复制的文件覆盖主文件(删除不需要的文件)
  • 启用写入查询并恢复正常状态

【讨论】:

    【解决方案3】:

    同时使用以下两个 PRAGMA 命令时,PDO::ATTR_TIMEOUT 似乎被忽略了。单独使用一个或另一个,超时按预期工作。 SQLite 版本:3.7.7.1

    PRAGMA journal_mode=PERSIST
    PRAGMA journal_mode=WAL
    

    我不明白您为什么要同时包含这两个,但我确实遇到了它们都被使用的情况,并且我看到 SQLite 数据库正忙消息,因为超时没有得到遵守。

    【讨论】:

      【解决方案4】:

      只有一种可能的解决方案——

      $dbConnection->setAttribute(PDO::ATTR_TIMEOUT, (int)$time_in_seconds);
      

      不要忘记,时间以秒为单位 :-)

      【讨论】:

      • PDO_ATTR_TIMEOUT 不存在,但 PDO::ATTR_TIMEOUT 存在
      • 注意:稍后更改超时不起作用。您必须在调用 new PDO() 时进行初始设置
      猜你喜欢
      • 2015-08-03
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多