我正在尝试将Ruby Sequel::Model
ORM功能用于Web服务,其中每个用户的数据都存储在单独的MySQL数据库中。可能有数千个用户,因此可能有数据库。
在每个Web请求中,我想构建连接字符串以连接到用户的数据,执行工作,然后关闭连接。
使用Sequel时,我可以指定用于特定代码块的数据库:
Sequel.connect(:adapter=>'mysql', :host=>'localhost', database=>'test1') do |db|
db.do_something()
end
这一切都很好,我可以在特定用户的数据库上执行Sequel操作。但是,当使用Sequel::Model
时,当我进行数据库操作时,它看起来像这样:
Supplier.create(:field1 => 'TEST')
即。它不会将db
作为参数,因此只使用一些共享数据库配置。
我可以通过两种方式配置数据库模型,设置全局DB
变量:
DB = Sequel.connect(:adapter=>'mysql', :host=>'localhost', database=>'test1')
class Supplier < Sequel::Model
end
或者,我可以只针对Model设置数据库:
Sequel::Model.db = Sequel.connect(:adapter=>'mysql', :host=>'localhost', database=>'test1')
class Supplier < Sequel::Model
end
在任何一种情况下,设置这样的共享变量都是不对的 - 可能会同时处理多个请求,每个请求都需要自己的数据库配置。
这有什么办法吗?有没有办法使用Sequel::Model
指定每个请求的数据库配置?
顺便说一下,我遇到了与DataMapper类似的问题,我现在想知道如果使用Ruby,是否只有一个多租户数据库是唯一的选择,尽管我更愿意避免这种情况因为它限制了可扩展性。
非常感谢解决方案或任何相关讨论。
由于 皮特
答案 0 :(得分:5)
使用Sequel对此的分片支持:http://sequel.jeremyevans.net/rdoc/files/doc/sharding_rdoc.html
答案 1 :(得分:0)
实际上在你的情况下,使用任意扩展名比分片更好:
DB.with_server(:host=>'hash_host_b', :database=>'backup') do
DB.synchronize do
# All queries here default to the backup database on hash_host_b
end
end
请参阅: http://sequel.jeremyevans.net/rdoc/files/doc/sharding_rdoc.html#label-arbitrary_servers+Extension