【问题标题】:Multiple database connection多数据库连接
【发布时间】:2008-10-03 14:08:08
【问题描述】:

我正在尝试了解连接到我的数据库的最佳方式。

目前我有一个解析 URL 的方法(取决于调用的 URL,应用程序必须连接到不同的数据库,例如 customer1.example.com 将连接到 customer1 数据库)并调用

ActiveRecord::Base.establish_connection(conn_string)

其中 conn_string 包含数据库的名称。

这个方法(set_db)是用a调用的

before_filter :set_db

在我的应用程序控制器中,所以基本上对于我收到的每个请求,都会解析 URL,并且应用程序会尝试进行建立连接。

我想知道我是否可以在某个地方建立一个连接池....您对此有什么建议吗?拥有一个保持所有连接并返回正确连接的单例会更好吗?

谢谢! 罗伯托

【问题讨论】:

  • 您可能需要考虑将语言(ruby)放在问题中。

标签: ruby-on-rails ruby


【解决方案1】:

数据库是否在同一台服务器上?

我有一个应用程序,其中一些模型对象来自一个数据库,而其他模型对象来自另一个数据库。我覆盖 table_name 函数来指定数据库。如果它们是不同的服务器,则无法正常工作,但适用于同一服务器中的不同数据库。

class xx < ActiveRecord.base

def self.table_name
  "otherdatabase.table"
end

看起来数据库池可能正在为即将推出的 Rails 版本推出。

What's New In Edge Rails

【讨论】:

    【解决方案2】:

    我不是 Ruby 程序员,但一般来说连接池是个好主意。您可以使该连接池成为单例并分发/收回连接。池可以在恢复连接后检查一切是否仍然正常。

    每个连接都应该有不同的生命周期和所有权,这样两个线程就不会同时使用一个连接。

    注意临时表,因为它们属于一个数据库会话。我们有一个错误,在高负载情况下我们会遇到奇怪的错误。最后我们记得我们在应用程序中使用了临时表。在高负载情况下,数据库连接中断并由连接对象自动重新生成,而应用程序代码不知道它(我们已经实现了重新连接,但忘记了在这种情况下这是一个问题)。我们要读取的临时表消失了。

    【讨论】:

      【解决方案3】:

      首先关于在您最初的帖子中留下的评论:这与 ruby​​ 无关。它与导轨的设计有关。

      话虽如此,您可能会劫持 ActiveRecord::Base 行为以保持由键索引的连接哈希(在您的情况下,键是用户名)然后拦截建立连接以检查池中的连接已经开放了

      这将要求您重新打开 ActiveRecord 库,这会使您的更改依赖于 AR 内部。

      【讨论】:

        【解决方案4】:

        我不会讨论你关于池的问题。但是,我相信汇集将有助于改善很多事情。我还有一个安装,每个客户端都有自己的数据库,并且代码库在它们之间共享。

        解析 url 的方法是在 Apache Rewrite 配置中的 Rails 外部实现的,因为可以将多个主机映射到单个客户。我还使用客户“密钥”访问网络服务器磁盘上的缓存文件。重写配置看起来像这样:

        RewriteMap accounts prg:domain_mapper.rb
        RewriteMap lowercase int:tolower
        
        RewriteCond %{HTTP_HOST} ^(.*)$
        RewriteCond ${accounts:${lowercase:%1}} ^(.+)$
        RewriteRule . - [E=ACCOUNT:%1]
        RequestHeader set Customer-Key %{ACCOUNT}e
        

        客户键将直接映射到将在 before_filter 方法中连接的数据库名称。

        到目前为止,在 Rails 端切换数据库连接不是性能问题。问题出在 MySQL 配置中,我们面临的问题是数据库过多,请求过多会导致 MySQL 中打开的数据库过多。

        我确定您一直在考虑迁移问题。一开始使用

        【讨论】:

          猜你喜欢
          • 2017-04-11
          • 2019-09-13
          • 2012-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多