2011-05-06 16 views
0

我有一個使用多個sqlite3的數據庫Rails應用程序(這部分是不可轉讓),我有以下類軌HAS_MANY通過和多個數據庫SQLite的造成:: BusyException

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秒,但同樣的異常只需要更長的時間才能出現。

回答

0

我也看到過這種情況。需要嘗試的幾件事:

  • 將database.yml中的超時設置爲10-15秒。你已經這樣做了,但它可能會幫助其他人解決這個問題。如果您的硬盤驅動器和測試數據很多,可能是20+或更多
  • 刪除並重新創建數據庫(如果這個數據庫在開發中可能不應該是個問題),或者恢復它的備份。它目前可能存在問題。錯誤地關閉開發服務器,也許?
  • 可能是一個延伸,但確保文件的權限是正確的。
+0

權限在默認數據庫上與用戶數據庫相同,因此默認數據庫工作正常,所以問題不大。已嘗試從頭開始刪除並重新創建數據庫。那裏沒有運氣。數據庫20秒的超時只會讓應用程序暫停20秒,然後拋出相同的異常。我甚至嘗試了1分鐘的超時時間,但同樣的錯誤發生。也許是時候去挖掘rails的establish_connection源碼了 – 2011-05-08 23:29:10