Ruby: SQLite3 :: BusyException: база данных заблокирована: - PullRequest
41 голосов
/ 23 августа 2011

Натолкнулся на это сообщение об ошибке во время разработки сегодня вечером: SQLite3::BusyException: database is locked:

У меня есть две модели:

  • Подкасты имеют много треков
  • Треки принадлежат Подкастам.
  • Файлы подкастов размещены на mixcloud .

Чтобы создать подкаст:

  • пользователь отправляет URL для подкаста на mixcloud
  • rails app получает json feed, связанный с url
  • json используется для установки атрибутов (заголовок, изображение и т. Д.) Для нового объекта подкаста

Я пытаюсь, чтобы мое приложение rails использовало тот факт, что канал json также детализирует имена (и исполнителей) треков, которые принадлежат этому подкасту.

Я думал, что следующий метод before_validation автоматически создаст все связанные дорожки при каждом создании нового подкаста.

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

Как я могу обойти это? Похоже, что rails (или sqlite3) не любит, когда я создаю новые экземпляры связанной модели таким образом. Как еще я могу это сделать? Я подозреваю, что это такая же проблема с Rails, как и с sqlite3. Я могу выложить больше кода, если это поможет.

Ответы [ 15 ]

60 голосов
/ 17 июля 2012

Для всех, кто сталкивался с этой проблемой с блокировкой SQLite в разработке, когда открыта консоль Rails, попробуйте следующее:

Просто запустите следующее:

ActiveRecord::Base.connection.execute("BEGIN TRANSACTION; END;")

В любом случае, мне кажется, что она очищает любую транзакцию, на которой держалась консоль, и освобождает базу данных.

Это особенно проблема для меня при запуске delayed_job, который, по-видимому, не может закрывать транзакцию довольно часто.

22 голосов
/ 16 ноября 2012

Для меня ... проблема, с которой я столкнулся, заключалась в том, что казалось, что консоль Rails, которую я какое-то время открывал, блокировала соединение с SQLite.

Так что, как только я вышел из этой консоли и перезапустилвеб-сервер (тонкий), он работал отлично.

Я попробовал предложение @ trisweb, но оно не сработало для меня.

21 голосов
/ 23 августа 2011

SQLite на самом деле не должен использоваться для одновременного доступа, что является проблемой, с которой вы здесь сталкиваетесь. Вы можете попытаться увеличить время ожидания в файле database.yml, что может стать для вас обходным решением. Однако я бы порекомендовал вам перейти на другую базу данных, которая поддерживает несколько соединений, например MySQL или PgSQL.

15 голосов
/ 16 августа 2013

У меня было то же "ActiveRecord :: StatementInvalid: SQLite3 :: BusyException: база данных заблокирована: INSERT INTO" users "(" creat_at "," email "," name "," password_digest "," updated_at ") VALUES (?,?,?,?,?) "вопрос.Я попробовал все, что нашел в Google, и у меня не получилось.Проблема была решена для меня, когда я закрыл свой браузер баз данных SQLite.

5 голосов
/ 24 сентября 2014

Убедитесь, что у вас нет 2 охранников или нескольких консолей.Если вы хотите убедиться, что отчаянно видите ответ «Без имени» выше.

Вы также можете попробовать увеличить пул:

, например: измените раздел теста в вашем config / database.yml, как показано ниже

test:
    adapter: sqlite3
    database: db/test.sqlite3
    pool: 50
    timeout: 5000
2 голосов
/ 26 января 2016

Возможно, у вас есть консоль Rails, открытая на другом bash, если это так, вы должны закрыть ее (ctrl + D).

1 голос
/ 30 июля 2017

Моя проблема в том, что я открыл программу управления базой данных под названием «DB Browser for SQlite». Закрыта эта программа управления базами данных, и проблема решена.

1 голос
/ 10 мая 2015

Скорее всего, это не связано с кодом рельсов. Одновременное использование консоли с параметром «песочница» (rails console --sandbox) делает проблему системной с SQLite, поскольку консоль в основном ожидает выхода, чтобы откатить все.

Приведенное выше решение от @trisweb не будет работать в этом случае, но выход из консоли будет.

1 голос
/ 18 февраля 2014

на самом деле для меня, я нашел, что убийственные рельсы помогают решить эту проблему.

используйте "ps aux | grep rails", чтобы узнать идентификатор текущего процесса рельсов. затем используйте

"kill -9 [rails-pid]"

чтобы убить процессы.

Тогда это будет работать

0 голосов
/ 27 марта 2018

попробуйте перезапустить сервер или закрыть любую запущенную консоль rails, у меня сработало

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...