Ruby on rails 为什么不是';t独角兽+;mysql2 gem在多工产品设置中显示最新版本的模型数据?

Ruby on rails 为什么不是';t独角兽+;mysql2 gem在多工产品设置中显示最新版本的模型数据?,ruby-on-rails,eventmachine,rainbows,Ruby On Rails,Eventmachine,Rainbows,我的模型似乎没有正确更新 独角兽彩虹!在EventMachine上 mysql2宝石 我可以在生产环境中以8名工人1000 rpm的速度进行复制。如果我在Rails控制台中更新my_model(通过调用reload!),一切正常。在本地我无法复制它 从控制器: # params[:my_model] = {:name => "new name"} def update @my_model = MyModel.first # {:name => "old name"} R

我的模型似乎没有正确更新

  • 独角兽彩虹!在EventMachine上
  • mysql2宝石
我可以在
生产
环境中以8名工人1000 rpm的速度进行复制。如果我在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
日志:


我错了什么?谢谢你的进步

模型中的数据是否由一些工作进程缓存,因此数据在一个工作进程中显示为新名称,而在另一个工作进程中显示为旧名称

添加每个工作ID并将其输出到日志可能会有所帮助。换句话说,当工作进程启动时,它应该为自己分配一个与其他工作进程唯一的ID(工作进程的PID将是一个很好的候选者)。通过这种方式,您可以看到是否有一个或多个员工始终存在问题,是否所有员工都有问题,或者是否在某些时候只有一些员工有问题。如果这是一个缓存问题,则可能是您只需等待该对象的所有辅助对象上的捕获无效,并且它最终将为所有辅助对象显示正确的更新值

如果您不能在本地复制它,是不是因为您在本地开发时只使用一个web服务器实例(一个worker)


另外,检查您的
生产
日志,查看在显示旧名称的实例中是否出现了
缓存
一词。

根本原因似乎是,当服务器处于高负载状态时,由于工作进程未执行操作,sql缓存在操作之间未清除。
我在没有负载的服务器上进行了测试-问题不会重现。 下面来自ApplicationController的代码修复了此问题,但此解决方案有点难看:

  before_filter do 
    MyModel.current.connection.clear_query_cache
  end
  before_filter do 
    MyModel.current.connection.clear_query_cache
  end