2011-05-24 160 views
2

我目前正在尝试解决一个issue in Drupal core's issue queue问题,当有人访问网站时,他们正在执行搜索索引,这是一个相当写密集的操作,通常发生在调用一个cron命令(所以它很可能发生在一个现场,同时仍然可以被公众访问)。它起源于SQLite对写操作的锁定,这通常不是问题,但在这种情况下,因为执行此索引会极大地增加连接在等待锁释放时超时的可能性。使用PHP/PDO避免锁定的SQLite数据库超时

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

+1

使用SQLite的网站比留言簿更复杂/博客是不是一个好理念。你应该移动到另一个数据库引擎或使用谷歌自定义搜索引擎进行网站搜索。 – Zyava 2011-05-24 10:20:22

+2

我没有为一个单一的网站工作,我可以做出这样的决定。我试图解决一个广泛使用的内容管理系统Drupal的核心问题。从系统中删除SQLite支持,或告诉每个人使用Google来满足他们的搜索需求,这两者都是不可能的,也是不切实际的。并且为了记录,SQLite对于站点来说是很好的选择。例如,获得大量匿名流量和/或托管在内存有限的VPS帐户上。 – 2011-05-26 10:48:12

+0

你有没有找到这个解决方案?我遇到与PHP5和SQlite3类似的问题。 – Jonathan 2011-12-13 10:33:20

回答

1

我已经成功使用

PRAGMA temp_store=MEMORY; PRAGMA journal_mode=MEMORY; 

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

+2

我不确定将journal_mode设置为MEMORY是一个好主意。以下是sqlite.org不得不说的:MEMORY日志模式将回滚日志存储在易失性RAM中。这节省了磁盘I/O,但是牺牲了数据库的安全性和完整性。如果在设置MEMORY日志记录模式时使用SQLite的应用程序在事务中间崩溃,那么数据库文件很可能会损坏。 – Jonathan 2011-12-13 10:40:21

1

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

如果让我建议做这样的:

    在应用层面
  • (如Drupal的核心代码),禁止所有编写查询中友好的方式
  • 拷贝数据库文件
  • 执行上复制文件的搜索索引,主文件没有锁定
  • 覆盖与复制的文件主文件(删除联合国需要的文件)
  • 启用写入查询并恢复到正常状态
1

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

PRAGMA journal_mode=PERSIST 
PRAGMA journal_mode=WAL 

我不明白你为什么会想包括这两种,但我没有遇到在那里他们都使用的情况,我所看到的SQLite数据库忙消息,因为超时没有得到尊重。

0

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

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

不要忘记,该时间以秒:-)