2010-04-13 60 views
2

我Rails應用程序的一部分轉換爲自己的末日應用與包括類數據庫連接。它有一些很強大的工作要做,而不是在app.rb中有一百萬個幫助,我已經把它分成了幾個類。沒有訪問rails我重寫查找幾種方法,並需要訪問我的班級內的數據庫。在應用程序和類之間共享數據庫連接的最佳方式是什麼?或者你會推薦將所有數據庫工作都推到自己的類中,只有在那裏建立連接?共享在西納特拉應用

下面是我在app.rb

require 'lib/myclass' 

configure :production do 
    MysqlDB = Sequel.connect('mysql://user:[email protected]:port/db_name') 
end 

我要訪問它的lib/myclass.rb

class Myclass 
    def self.find_by_domain_and_stub(domain, stub) 
    # want to do a query here 
    end 
end 

我已經試過幾件事情,但沒有什麼似乎工作得很好,甚至包括作爲一個例子。

回答

3

假設你沒有做任何線程,剛剛成立的連接作爲一個全局變量。

require 'lib/myclass' 

before do 
    $MysqlDB = Sequel.connect('mysql://user:[email protected]:port/db_name') 
end 

class Myclass 
    def self.find_by_domain_and_stub(domain, stub) 
    # use $MysqlDB here 
    end 
end 

或許明智地檢查連接超時設置,或明確斷開與服務器的連接。如果您處理了很多請求,則可能會在連接超時之前耗盡連接。

+0

完美,正是我需要的 – 2010-04-14 13:15:21

3

蒂姆·羅森布拉特的回答將重新連接在每次請求。這是更好地做到以下幾點在你的末日應用:

require 'sequel' 
DB = Sequel.connect('mysql://user:[email protected]:port/db_name') 
require 'lib/myclass' 

這是更好地使用恆定比在這種情況下,一個全局變量。

+0

你會改變你的想法,如果我告訴你,應用程序將僅用於一個API調用,預計做單請求,並關閉連接正確後? – 2010-04-16 18:28:25

+2

對此的續集解決方案將調用連接塊,我將在實際的Sinatra操作中執行此操作,而不是之前的操作。 GET( '... ')做 Sequel.connect(' 的mysql://用戶名:密碼@主機:端口/ DB_NAME')做|數據庫| ... 結束 結束 – 2010-04-16 20:53:20

+0

才意識到我是不是我給你的答案的評論很清楚。單個api調用仍然需要執行相當多的查詢,並在返回結果之前跳過一些複雜的循環。我已經理解你的意思是數據庫將重新連接每個請求(如頁面加載)。這是你的意思,或者你是否意味着每次我在我的代碼中調用全局變量時,db連接都會重新建立? – 2010-04-21 04:40:17