#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