我正在尝试修复issue in Drupal core's issue queue,当有人在执行搜索索引时访问某个站点时发生超时,这是一种通常在调用cron命令时发生的写入密集型操作(所以它很可能发生在现场,同时仍然可以访问公众)。它源于SQLite对写入的锁定,这通常不是问题,但在这种情况下,因为执行此索引会大大增加连接在等待锁定释放时超时的可能性。
答案似乎是增加驱动程序等待锁释放的时间。在PHP中,可以通过将PDO::ATTR_TIMEOUT
选项设置为等待锁定的秒数来实现。但是,这似乎并没有真正起作用;无论发生什么价值,都会发生超时。我找不到它在互联网上的任何其他地方都没有工作,但是,它只是我们吗?有没有其他人在尝试增加SQLite的超时时间时遇到麻烦?是否有其他方法可以避免这个问题的发生?
答案 0 :(得分:1)
我已经设法通过使用
来缓解这种情况PRAGMA temp_store=MEMORY; PRAGMA journal_mode=MEMORY;
在写作时使用交易。它不会完全解决它,但它会使你的写入速度更快,特别是如果它是一堆同时完成的更新/插入。
答案 1 :(得分:1)
执行搜索索引时是否可以进入只读状态? (只读比超时更好......)
如果是这样,我会建议这样做:
答案 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: - )