2009-11-01 20 views
4

這裏是我的應用程序的輪廓:MySQL連接超時 - MySQL服務器已消失(西納特拉,ActiveRecord的)

require 'sinatra' 
require 'active_record' 

ActiveRecord::Base.establish_connection(
    :adapter => "mysql", host => $DB_HOSTNAME, 
    :database => $DB_NAME,:username => $DB_USERNAME,:password => $DB_PASSWORD) 

class Sometable < ActiveRecord::Base 
end 

get '/' do 
    #stuff with Sometable 
end 

# a lot of route handlers.. 

我打電話establish_connection只有一次 - 應用程序初始化過程中。我遇到了MySQL的8小時閒置連接限制(MySQL server has gone away),我想知道最好的辦法。

我經歷了ActiveRecord的來源,發現它彙集了數據庫服務器連接。那麼,我應該在每個Web請求內創建一個新連接還是增加超時設置?

謝謝你的時間!

回答

1

感謝您的所有答案。 MYSQL_OPT_RECONNECT似乎是一個很好的解決方案。但我不確定如何使用ActiveRecord來做到這一點。

現在,我使用已經解決了它:

#prevent MySQL server has gone away by verifying connections every 30 minutes. 
Thread.new { 
    loop { 
    sleep(60*30); 
    ActiveRecord::Base.verify_active_connections! 
    } 
}.priority = -10 
1

您可以爲mysqld增加wait_timeout變量。它可以在配置文件中設置或通過命令行參數傳遞。

您是否使用持續連接?

另一件事嘗試是讓MySQL客戶端集MYSQL_OPT_RECONNECT

1

我有一個類似的問題突然啓動(在某些C++代碼中)當mySQL升級時。

這是因爲自動重新連接在版本5.0.3(http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html)中默認設置爲0。我不得不在代碼中將MYSQL_OPT_RECONNECT設置爲「1」。

注意:它應該在任何mySQL init()調用之後並在進行實際連接之前調用。