Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby:SQLite3::BusyException:数据库已锁定:_Ruby On Rails_Sqlite - Fatal编程技术网

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用于设置新播客对象的属性(标题、图像等)
我试图让我的rails应用程序利用json提要还详细说明了属于这个播客的曲目的名称(和艺术家)

我认为下面的before_验证方法会在我们创建新播客时自动创建所有相关的曲目

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)