Ruby on rails Ruby:SQLite3::BusyException:数据库已锁定:
今晚开发时遇到此错误消息:Ruby on rails Ruby:SQLite3::BusyException:数据库已锁定:,ruby-on-rails,sqlite,Ruby On Rails,Sqlite,今晚开发时遇到此错误消息:SQLite3::BusyException:数据库已锁定: 我有两种型号: 播客有很多曲目 曲目属于播客 播客文件托管在上 要创建播客,请执行以下操作: 用户提交mixcloud上播客的url rails应用程序获取与url关联的json提要 json用于设置新播客对象的属性(标题、图像等) 我试图让我的rails应用程序利用json提要还详细说明了属于这个播客的曲目的名称(和艺术家) 我认为下面的before_验证方法会在我们创建新播客时自动创建所有相关的曲
SQLite3::BusyException:数据库已锁定:
我有两种型号:
- 播客有很多曲目
- 曲目属于播客
- 播客文件托管在上
- 用户提交mixcloud上播客的url
- rails应用程序获取与url关联的json提要
- json用于设置新播客对象的属性(标题、图像等)
class Podcast < ActiveRecord::Base
attr_accessible :mixcloud_url, :lots, :of, :other, :attrs
has_many :tracks
before_validation :create_tracks
def create_tracks
json = Hashie::Mash.new HTTParty.get(self.json_url)
json.sections.each do |section|
if section.section_type=="track"
Track.create(:name=>section.track.name, :podcast_id=>self.id)
end
end
end
end
classpodcastsection.Track.name,:podcast\u id=>self.id)
结束
结束
结束
结束
我怎样才能避开这件事?看起来rails(或sqlite3)不喜欢我以这种方式创建关联模型的新实例。我还能怎么做?我怀疑这和sqlite3一样是rails的问题。如果有帮助的话,我可以发布更多的代码。SQLite实际上不应该用于并发访问,这是您在这里遇到的问题。您可以尝试增加
数据库.yml
文件中的超时时间,在这种情况下,这可能是一种解决方法。但是,我建议您切换到另一个支持多个连接的数据库,如MySQL或PgSQL。如果其他人在Rails控制台打开时在开发中遇到SQLite锁定问题,请尝试以下操作:
只需运行以下命令:
ActiveRecord::Base.connection.execute("BEGIN TRANSACTION; END;")
无论如何,对我来说,它似乎清除了控制台持有的任何事务,并释放了数据库
这对我来说尤其是在运行延迟的_作业时,它似乎经常在关闭事务时失败。对我来说……我遇到的问题是,我打开了一段时间的Rails控制台似乎锁定了与SQLite的连接 因此,一旦我退出该控制台,重新启动我的Web服务器(瘦),它就工作得很好 我尝试了@trisweb的建议,但对我无效。我也有同样的建议 ActiveRecord::语句无效:SQLite3::BusyException:数据库不可用 锁定:插入“用户”(“创建于”,“电子邮件”,“名称”, “密码摘要”,“更新的”值(?,,,,,?,?)”
问题。我尝试了在Google中找到的所有方法,但都失败了。当我关闭SQLite数据库浏览器时,问题为我解决了。事实上,我发现杀死rails有助于解决这个问题 使用“ps aux|grep rails”查找正在进行的rails进程id。 然后使用 终止进程
然后它会工作确保没有2个防护装置或几个控制台在运行。 如果你想看到上面“没有名字”的答案 您也可以尝试增加池容量: 例如: 将config/database.yml中的测试部分更改如下
test:
adapter: sqlite3
database: db/test.sqlite3
pool: 50
timeout: 5000
它很可能与rails代码无关。同时使用控制台和沙盒选项(
rails控制台--sandbox
)会使问题在SQLite中系统化,因为控制台基本上在等待退出以回滚所有内容
以上@trisweb的解决方案在这种情况下不起作用,但退出控制台会起作用。是的,这是一个老问题,这里已经有很多答案。但没有一个对我有效,这意味着我花了很长时间才最终解决问题。我找到了有效的方法,并将与大家分享,以防这是可能的原因我也会帮你解决这个问题。 我使用的是SQLITE浏览器(它是一个GUI数据库浏览器)。我在这里将其称为“GUI”(以防止与“浏览器”一词混淆,即您的localhost::8000 chrome浏览器或其他任何浏览器。
我正在监视写入数据库的内容,并在我的rails应用程序在chrome浏览器中运行时打开GUI。我会刷新GUI,查看它是否按照我的预期添加了数据 作为一个调试问题,我决定从SQLite GUI中删除一行,这样我就可以看到我的应用程序是否会对丢失的行做出适当的反应 事实证明,SQLite浏览器实际上并没有删除该行(这让我很困惑,为什么我的应用程序表现得好像该行仍然存在,尽管它在GUI上看起来不存在).无论如何,在30分钟的挫折之后,我关闭了SQLite GUI,然后收到一条通知,询问我是否要保存对数据库所做的任何更改。我天真地单击了“否”并关闭了应用程序 显然,GUI随后锁定了数据库,因为我的数据库中有一些行在没有提交删除的情况下被“软删除”,所以GUI(没有更好的术语)使数据库处于不确定状态 这解释了为什么a)我的应用程序没有表现出行丢失的样子,因为它实际上还没有被删除,B)解释了数据库被锁定的原因。它仍在等待我提交删除操作 因此,为了解决这个问题,我只需再次打开GUI并删除同一行,然后关闭GUI,这一次,我在请求保存对数据库的更改时单击“是”。它保存了删除并解锁了数据库,现在我的应用程序工作了
我希望这能帮助其他可能有同样问题但使用SQLite浏览器的人
test:
adapter: sqlite3
database: db/test.sqlite3
pool: 50
timeout: 5000
def create_tracks
json = Hashie::Mash.new HTTParty.get(self.json_url)
Track.transaction do
json.sections.each do |section|
if section.section_type=="track"
Track.create(:name=>section.track.name, :podcast_id=>self.id)
end
end
end
end
parallelize(workers: :number_of_processors, with: :threads)
parallelize(workers: :number_of_processors)