首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLite3::BusyException

SQLite3::BusyException
EN

Stack Overflow用户
提问于 2008-09-17 01:02:39
回答 14查看 27.1K关注 0票数 38

现在使用SQLite3运行一个rails站点。

大约每500个请求一次,我就会收到一个

ActiveRecord::StatementInvalid (SQLite3::BusyException:数据库已锁定:...

有什么方法可以最大限度地减少对我的代码的侵扰?

我现在使用的是SQLLite,因为你可以将数据库存储在源代码管理中,这使得备份变得很自然,而且你可以非常快地将更改推送出去。但是,它显然不是真正为并发访问设置的。明天早上我将迁移到MySQL。

EN

回答 14

Stack Overflow用户

发布于 2009-04-10 22:15:41

您提到这是一个Rails站点。Rails允许您在database.yml配置文件中设置SQLite重试超时:

代码语言:javascript
复制
production:
  adapter: sqlite3
  database: db/mysite_prod.sqlite3
  timeout: 10000

超时值以毫秒为单位指定。将其增加到10或15秒应该会减少您在日志中看到的BusyExceptions数量。

不过,这只是一个暂时的解决方案。如果您的站点需要真正的并发,那么您将不得不迁移到另一个数据库引擎。

票数 57
EN

Stack Overflow用户

发布于 2010-11-19 23:40:50

所有这些都是真的,但它没有回答这个问题,这个问题很可能是:为什么我的Rails应用程序在生产中偶尔会引发SQLite3::BusyException?

@Shalmanese:产品托管环境是什么样的?它是否在共享主机上?包含sqlite数据库的目录是否在NFS共享上?(很可能是在共享主机上)。

这个问题可能与文件锁定现象和NFS共享以及SQLite缺乏并发性有关。

票数 3
EN

Stack Overflow用户

发布于 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

替换为:

代码语言:javascript
复制
  def begin_db_transaction #:nodoc:
    catch_schema_changes { @connection.transaction }
  end

使用

代码语言:javascript
复制
  def begin_db_transaction #:nodoc:
    catch_schema_changes { @connection.transaction(:immediate) }
  end

仅此而已!我们没有注意到性能下降,现在应用程序支持更多的请愿而不会中断(它会等待超时)。Sqlite很不错!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/78801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档