根据this回答他们是,但是海报说JRuby中的事情有所不同所以我很困惑?
我正在使用类实例变量实现多租户解决方案,因此我使用的Ruby实现或Web服务器并不重要,我需要确保数据不会被泄露。
这是我的代码:
class Tenant < ActiveRecord::Base
def self.current_tenant=(tenant)
@tenant = tenant
end
def self.current_tenant
@tenant
end
end
我需要做些什么才能确保无论发生什么(更改Ruby实现,更改Web服务器,新的Ruby线程功能等),我的代码都是线程安全的?
答案 0 :(得分:14)
由于租赁属性的范围是请求,我建议您将其保留在当前线程的范围内。由于请求是在一个线程上处理的,并且一个线程一次处理一个请求 - 只要您始终在请求开始时设置租期就可以了(为了额外的安全性,您可能希望取消在请求结束时分配租户。)
为此,您可以使用thread local属性:
class Tenant < ActiveRecord::Base
def self.current_tenant=(tenant)
Thread.current[:current_tenant] = tenant
end
def self.current_tenant
Thread.current[:current_tenant]
end
def self.clear_current_tenant
Thread.current[:current_tenant] = nil
end
end
由于这是使用线程存储,因此您完全是线程安全的 - 每个线程都负责自己的数据。