2012-10-22 84 views
1

我有一個非常簡單的使用Rack的Web服務,沒有Rails,我將在每個有效連接上聯繫MySQL。我想堅持連接(例如在構造函數中),以便在每次請求時重用它。比方說像這樣:如何使用Ruby(無RoR)持久化mysql連接(mysql2 gem)

class Service 

    def initialize(dbhost, dbport, dbname, dbuser, dbpass) 
     @client = Mysql2::Client.new(
      :host => dbhost, 
      :port => dbport, 
      :database => dbname, 
      :username => dbuser, 
      :password => dbpass) 
    end 

    def call(env) 
     # some logic that will call: 
     results = _query(sql) 
    end 

    def _query(sql) 
     results = @client.query(sql) 
    end 

    end 

    Rack::Handler::Mongrel.run Service.new(DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASS), :Port => 8123 

通過上面的代碼,該服務將獲得一個MySQL連接,並在每一次請求它會做一個查詢。但是,如何確保連接斷開,_query方法將重新連接?

+0

你確定連接是否建立在每一個請求,你可以檢查是否是這將是奇怪,因爲通常是多年平均值發生 – Viren

+0

它不是!正如我所說,我想建立並堅持它只有一次,並重用'_query'方法。我希望能夠處理下降的情況。 – ddinchev

+0

糾正我,如果我錯了'它不是'什麼不在這裏,它每次都會建立連接或者每次都沒有建立連接,正如我之前說的,Rack的行爲就像上面提到的那樣,即任何'middleware new'只在調用期間被調用一次當middelware堆棧被構建時,它會如此顯示你連接的代碼persit – Viren

回答

4

那麼,:reconnect => true似乎確保連接是持久的。

@client = Mysql2::Client.new(
     :host => dbhost, 
     :port => dbport, 
     :database => dbname, 
     :username => dbuser, 
     :password => dbpass, 
     :reconnect => true 
    )