现在使用SQLite3运行rails站点.
大概每500个请求左右,我得到一个
ActiveRecord :: StatementInvalid(SQLite3 :: BusyException:数据库被锁定:...
解决这个问题的方法是什么,这对我的代码来说是微创的?
我目前正在使用SQLLite,因为您可以将数据库存储在源代码控制中,这使得备份变得自然,您可以非常快速地推出更改.但是,它显然没有真正设置为并发访问.我明天早上会迁移到MySQL.
您提到这是一个Rails站点.Rails允许您在database.yml配置文件中设置SQLite重试超时:
production: adapter: sqlite3 database: db/mysite_prod.sqlite3 timeout: 10000
超时值以毫秒为单位指定.将其增加到10或15秒应该会减少您在日志中看到的BusyExceptions的数量.
不过,这只是一个临时解决方案.如果您的站点需要真正的并发性,那么您将不得不迁移到另一个数据库引擎.
默认情况下,如果数据库忙且已锁定,则sqlite会立即返回阻塞的忙碌错误.你可以要求它等待,并在放弃之前继续尝试一段时间.这通常可以解决问题,除非你有1000个线程访问你的数据库,当我同意sqlite是不合适的.
// set SQLite to wait and retry for up to 100ms if database locked sqlite3_busy_timeout( db, 100 );