0

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

  • 独角兽彩虹!在事件机器上
  • mysql2 宝石

我可以production在 8 个工作人员上以 1000 rpm 的速度在环境中重现。如果我my_model在 Rails 控制台中更新(调用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

我错了什么?感谢提前!

4

2 回答 2

0

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

  before_filter do 
    MyModel.current.connection.clear_query_cache
  end
于 2012-12-07T12:37:31.167 回答
0

模型中的数据是否被某些工作人员缓存,以使数据在一个工作人员中看起来新名称,而在另一个工作人员中显示为旧名称

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

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

此外,请检查您production的日志并查看该词CACHE是否出现在显示旧名称的实例中。

于 2012-12-06T18:26:51.083 回答