【发布时间】:2009-04-29 20:12:51
【问题描述】:
(这是关于 Ramaze.net 框架的)
我在存储自定义对象时遇到了一些非常奇怪的问题 在会话中。我注意到只有对象的属性 立即存储在会话中正在更新。然而,如果那些 对象包含对其他对象的引用,那些被引用的对象 如果会话中包含直接对象,则对象未更新 在请求期间没有更改。
这个问题只有在我使用 Ramaze::FileCache 时才变得明显 作为我的会话缓存后端。我相信问题是否被掩盖 使用内存会话时的问题。
我发现问题是由于会话中的“浅拷贝” Ramaze::Session::Hash#method_missing 中的逻辑 (lib/ramaze/current/session/hash.rb)。
作为一个快速测试以确保我的想法是正确的,我注释掉了 “差异检查”本质上是强制更新会话 每次。
def method_missing(*args, &block)
old = @hash.dup
result = @hash.send(*args, &block)
#unless old == @hash
Cache.sessions[@session.session_id] = self
#end
result
end
这个小技巧解决了我的问题。现在我的问题是:
- 是安全合理的解决方案吗?
- 我应该避免在会话中存储复杂/深层对象吗?
- 我有什么遗漏吗?
【问题讨论】: