现在使用SQLite3运行一个rails站点。
大约每500个请求一次,我就会收到一个
ActiveRecord::StatementInvalid (SQLite3::BusyException:数据库已锁定:...
有什么方法可以最大限度地减少对我的代码的侵扰?
我现在使用的是SQLLite,因为你可以将数据库存储在源代码管理中,这使得备份变得很自然,而且你可以非常快地将更改推送出去。但是,它显然不是真正为并发访问设置的。明天早上我将迁移到MySQL。
发布于 2009-04-10 22:15:41
您提到这是一个Rails站点。Rails允许您在database.yml配置文件中设置SQLite重试超时:
production:
adapter: sqlite3
database: db/mysite_prod.sqlite3
timeout: 10000超时值以毫秒为单位指定。将其增加到10或15秒应该会减少您在日志中看到的BusyExceptions数量。
不过,这只是一个暂时的解决方案。如果您的站点需要真正的并发,那么您将不得不迁移到另一个数据库引擎。
发布于 2010-11-19 23:40:50
所有这些都是真的,但它没有回答这个问题,这个问题很可能是:为什么我的Rails应用程序在生产中偶尔会引发SQLite3::BusyException?
@Shalmanese:产品托管环境是什么样的?它是否在共享主机上?包含sqlite数据库的目录是否在NFS共享上?(很可能是在共享主机上)。
这个问题可能与文件锁定现象和NFS共享以及SQLite缺乏并发性有关。
发布于 2011-05-23 23:46:40
只是为了记录在案。在一个使用Rails 2.3.8的应用程序中,我们发现Rails忽略了Rifkin Habsburg建议的“超时”选项。
经过进一步的调查,我们在Rails dev中发现了一个可能相关的bug:http://dev.rubyonrails.org/ticket/8811。经过进一步的研究,我们发现了the solution (使用Rails 2.3.8进行了测试):
编辑此ActiveRecord文件: activerecord-2.3.8/lib/active_record/connection_adapters/sqlite_adapter.rb
替换为:
def begin_db_transaction #:nodoc:
catch_schema_changes { @connection.transaction }
end使用
def begin_db_transaction #:nodoc:
catch_schema_changes { @connection.transaction(:immediate) }
end仅此而已!我们没有注意到性能下降,现在应用程序支持更多的请愿而不会中断(它会等待超时)。Sqlite很不错!
https://stackoverflow.com/questions/78801
复制相似问题