陷入单例的泥沼

shaka 2008-09-02
简要的说,
应该说rails并排斥设计模式吧,比如说单例,不然rails单例就多此一举了。
可是,在rails中应用单例,却遇到这种情况:

在外部(其他类)调用单例类生成单例,每次生成的对象都不一样。
可是在控制台测试这个类,每次生成单例都没问题,原因呢。
liusong1111 2008-09-06
是production模式还是development模式?(关心的是environment配置的cache_classes是true还是false)

在development模式下,类的反复重新加载可能引发问题,但我不确信是不是这个原因。

另外,如果存全局数据,需要用数据库或其它单点存储方案,因为rails是多进程布署模式,每个进程的单例,在整个运行环境中也不能算单例了。

shaka 2008-09-08
开发模式下,
config.cache_classes = false

看来是这个原因,
改成config.cache_classes = true,
问题就迎刃而解了.

thank you,liusong!
liusong1111 2008-09-13
不客气。记得几年前你也给我解答过问题呢:)

config.cache_classes 设成 true后,类的自动加载机制就失效了。改ruby文件要重启server才能生效。

我在某个贴子说过,rails/ruby的自动加载机制并不是脚本语言天生的好处,而是通过好多手段模拟出来的。引发的问题很多。我们打过补丁,惭愧的是没提交给社区。那个补丁也不是解决的上述问题。

我们很多同事都直接用production模式开发了,还因为development模式运行太慢,现在辅以rspec,也挺好。系统很大,但重启服务器很快。

rails的observer都是单例模式,在environment.rb里
config.active_record.observers = :some_observer
配置起来,rails Initializer在某个时机下初始化实例。不知道它有没有解决上述问题,如果解决了,可以从它源码上查到方案。

Global site tag (gtag.js) - Google Analytics