gpt4 book ai didi

mysql - 在 Rails 中迭代多个数据库的安全方法

转载 作者:可可西里 更新时间:2023-11-01 07:08:30 26 4
gpt4 key购买 nike

我有几个 Rails 应用程序在一个 MySQL 服务器上运行。它们都运行相同的应用程序,所有数据库都具有相同的架构,但每个数据库都属于不同的客户。

从概念上讲,这是我想要做的:

   Customer.all.each do |customer|
connection.execute("use #{customer.database}")
customer.do_some_complex_stuff_with_multiple_models
end

这种方法行不通,因为当它在网络请求中运行时,底层模型类会缓存来自 A/R 连接池的不同数据库连接。所以我执行“use”语句的连接可能不是模型使用的连接,在这种情况下它会查询错误的数据库。

我通读了 Rails A/R 代码(3.0.3 版),想出了在循环中执行的代码,而不是“use”语句:

ActiveRecord::Base.clear_active_connections!
ActiveRecord::Base.establish_connection(each_customer_database_config)

我相信连接池是每个线程的,所以这似乎会破坏连接池并仅为 Web 请求所在的一个线程重新建立连接池。但是,如果连接以某种我没有看到的方式共享,我不希望该代码对同一应用程序中的其他事件网络请求造成严重破坏。

在正在运行的网络应用程序中这样做安全吗?还有其他方法吗?

最佳答案

IMO 为不同的请求切换到新的数据库连接是一项非常昂贵的操作。 AR 维持有限的连接池。

我猜你应该转向 PostgreSQL,在那里你有模式的概念。

在理想的 SQL 世界中,这是数据库的结构

database --> schemas --> tables

在MYSQL中,数据库和模式是一回事。 Postgres 有单独的模式,可以为不同的客户保存表。您可以通过设置

在不更改 AR 连接的情况下即时切换模式
ActiveRecord::Base.connection.set_schema_search_path("CUSTOMER's SCHEMA")

不过,开发它需要一些技巧。

关于mysql - 在 Rails 中迭代多个数据库的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5099241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com