使用PHP / PDO避免锁定的SQLite数据库超时

时间:2011-05-24 09:49:59

标签: php sqlite pdo

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

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

4 个答案:

答案 0 :(得分:1)

我已经设法通过使用

来缓解这种情况
PRAGMA temp_store=MEMORY; PRAGMA journal_mode=MEMORY; 

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

PRAGMA journal_mode=PERSIST
PRAGMA journal_mode=WAL

我不明白为什么你想要包含这两个,但我确实遇到了这两种情况都被使用的情况,我看到SQLite数据库正忙,因为没有遵守超时。< / p>

答案 3 :(得分:1)

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

$dbConnection->setAttribute(PDO_ATTR_TIMEOUT, (int)$time_in_seconds);

不要忘记,时间是在SECONDS: - )