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

问题描述 投票:3回答:4

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

答案似乎是增加驱动程序等待锁定释放的时间。在PHP中,可以通过将PDO::ATTR_TIMEOUT选项设置为等待锁定的秒数来实现。但是,这似乎并不实际。不管发生什么值,超时都会发生。我找不到关于它在互联网上其他任何地方都无法使用的任何提及,那是我们吗?还有其他人在尝试增加SQLite的超时时间时遇到麻烦吗?也许还有其他方法可以避免此问题的发生?

php sqlite pdo
4个回答
1
投票

我已经设法通过使用以下方法减轻了这一点

PRAGMA temp_store=MEMORY; PRAGMA journal_mode=MEMORY; 

以及在编写时使用事务。它无法完全解决问题,但是它将使您的写入快得多,尤其是当它是一堆同时完成的更新/插入时。


1
投票

执行搜索索引编制时是否可以进入只读状态?(只读优于超时...)

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

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

1
投票
一起使用以下两个PRAGMA命令时,

PDO :: ATTR_TIMEOUT似乎被忽略了。单独使用一个或另一个,超时将按预期工作。 SQLite版本:3.7.7.1

PRAGMA journal_mode=PERSIST
PRAGMA journal_mode=WAL

我不知道为什么要同时包含这两个属性,但是我确实遇到了同时使用它们的情况,并且我看到SQLite数据库正忙,因为超时未得到遵守。


1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.