rails пропускает множество и несколько баз данных, вызывающих исключение SQLite :: BusyException

#ruby-on-rails-3 #sqlite

#ruby-on-rails-3 #sqlite

Вопрос:

У меня есть приложение rails, которое использует несколько баз данных sqlite3 (эта часть не подлежит обсуждению), и у меня есть следующие классы

 class User < ActiveRecord::Base
   establish_connection "users_#{Rails.env}" # use alternate DB
   has_many :memberships
   has_many :groups, through => :memberships
end

class Group < ActiveRecord::Base
   establish_connection "users_#{Rails.env}" # use alternate DB
   has_many :memberships
   has_many :users, :through => :memberships
end
class Membership < ActiveRecord::Base
   belongs_to :group
   belongs_to :user
   # validations stuff
   establish_connection "users_#{Rails.env}" # use alternate DB
end
  

Когда я создаю пользователя с группой, я получаю следующее:

 ActiveRecord::StatementInvalid (SQLite3::BusyException: database is locked: INSERT INTO "memberships" ...
  

Однако, когда я удаляю вызов метода «establish_connection» и использую единую базу данных по умолчанию, все работает нормально и так, как ожидалось.

Я попытался увеличить время ожидания в database.yml до 15 секунд, но для появления того же исключения требуется больше времени.

Ответ №1:

Я тоже видел, как это происходило. Несколько вещей, которые нужно попробовать:

  • Увеличьте время ожидания в database.yml до 10-15 секунд. Вы уже делали это, но это может помочь кому-то другому с этой проблемой. Если у вас медленный жесткий диск и много тестовых данных, возможно, 20
  • Либо удалите и заново создайте базу данных (если она находится в разработке, что, вероятно, не должно быть проблемой), либо восстановите ее резервную копию. В настоящее время с этим может возникнуть проблема. Возможно, неправильное завершение работы сервера разработки?
  • Может быть натяжкой, но убедитесь, что разрешения для файла правильные.

Комментарии:

1. Разрешения для базы данных по умолчанию такие же, как и для базы данных пользователей, так что это не проблема, поскольку база данных по умолчанию работает нормально. Пытались удалить и воссоздать базу данных с нуля. Здесь не повезло. 20-секундный тайм-аут в базе данных просто заставляет приложение приостановиться на 20 секунд, прежде чем выдать то же исключение. Я даже пробовал использовать тайм-аут в 1 минуту, но возникает та же ошибка. Возможно, пришло время покопаться в источнике rails establish_connection