2012-12-06 14 views
0

我的模型似乎沒有正確更新。爲什麼不是獨角獸+ mysql2 gem在多工人prod設置中顯示最新版本的模型數據?

  • 獨角獸彩虹!在EventMachine的
  • mysql2寶石

我可以在production環境再現與1000轉的8名工人。如果我在Rails控制檯更新my_model(呼叫reload!),所有工作正常。本地我無法複製它。

從控制器:

# params[:my_model] = {:name => "new name"} 
def update 
    @my_model = MyModel.first # {:name => "old name"} 
    Rails.logger.info @my_model.name 
    @my_model.update_attributes(params[:my_model]) 
    redirect_to :action => :index 
end 

登錄:

new name 
old name 
old name 
old name 
new name 

什麼我錯了嗎?感謝您的提前!

回答

0

是由一些工人被緩存在模型中的數據,使數據出現在一個工人是新名稱,但舊名在另一工作人員?

添加每個工作ID並將其輸出到您的日誌可能會有所幫助。換句話說,當你的員工啓動時,它應該爲自己分配一個與其他員工不同的ID(工人的PID將是一個很好的候選人)。通過這種方式,您可以查看一個或多個員工是否始終存在問題,是否所有員工都是這樣,或者某些時候只有一些員工。如果事實證明這是一個緩存問題,那麼您可能需要等待該對象的所有工作人員的catch失效,並且最終將顯示所有worker的正確更新值。

如果您不能在本地重現它,那是因爲您在本地開發時只使用單個Web服務器實例(一名工作人員)嗎?

此外,檢查你production日誌,看看字CACHE是表示在被顯示的老字號實例了。

0

看起來像根本原因是,當服務器處於高負載下時,由於工作進程沒有停止操作,SQL緩存不會在操作之間清除。
我在服務器上測試沒有負載 - 問題沒有轉載。 來自ApplicationController的代碼解決了這個問題,但是這個解決方案有點難看:

before_filter do 
    MyModel.current.connection.clear_query_cache 
    end 
相關問題