为什么Rails中Application Controller的类变量在不同的请求中重新初始化

时间:2011-02-24 13:48:15

标签: ruby-on-rails

我的应用程序控制器名为McController,它扩展了ApplicationController,我在McController中设置了一个名为@@ scheduler_map的类变量,如下所示:

class McController < ApplicationController
  @@scheduler_map = {}
  def action
    ...
  end
  private
  def get_scheduler(host, port)
    scheduler = @@scheduler_map[host+"_"+port]
    unless scheduler
      scheduler = Scheduler.create(host, port)
      @@scheduler_map[host+"_"+port] = scheduler
    end
    scheduler
  end
end

但我发现从第二个请求开始@@ scheduler_map始终是一个空哈希,我在开发环境中运行它,有人知道原因吗?那与运行环境有关吗?

提前谢谢。

1 个答案:

答案 0 :(得分:9)

你回答了自己的问题: - )

是的,这是由开发环境(我测试过)引起的,更准确地说是config / environments / development.rb中的配置选项“config.cache_classes = false”

此标志将导致在每次请求时重新加载所有类。 这样做是因为当您对控制器进行少量更改时,您不必重新启动整个服务器。

您可能需要考虑一下,当您稍后在生产中进行大量访问时,您正在尝试的内容可能会导致巨大的内存泄漏。 每次用户访问您的网站时,它都会在该哈希中创建一个新的主菜,并且永远不会被清除。 想象一下,如果10.000用户访问过您的网站会发生什么?或者1.000.000怎么样? 所有这些数据都保存在系统内存中,因此服务器上线的时间越长,就会占用大量空间。

此外,我不确定此解决方案是否适用于生产服务器。 服务器将创建多个威胁,以同时处理大量访问者。 我认为(不确定)每个威胁都有自己的类实例。 这意味着在处理1中可能存在ip xx的调度映射,但在处理2中则不存在。 如果你给我一些关于这个调度程序的更多信息,我可以给出一个不同解决方案的建议。