多个数据库连接

时间:2008-10-03 14:08:08

标签: ruby-on-rails ruby

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

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

ActiveRecord::Base.establish_connection(conn_string)

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

使用

调用此方法(set_db)
before_filter :set_db

在我的应用程序控制器中,所以基本上对于我得到的每个请求,解析URL并且应用程序尝试执行establish_connection。

我想知道我是否可以在某个地方建立连接池....你有什么建议吗?有一个Singleton可以保持所有连接并返回正确的连接吗?

谢谢! 罗伯特

4 个答案:

答案 0 :(得分:1)

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

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

class xx < ActiveRecord.base

def self.table_name
  "otherdatabase.table"
end

看起来数据库池可能正在为一个升级版本的rails。

What's New In Edge Rails

答案 1 :(得分:0)

我不是Ruby程序员,但一般来说连接池是个好主意。您可以使该连接池成为单例并分发/收回连接。在收回连接后,游泳池可以检查是否所有物品仍然有序。

您应该为每个连接设置不同的生命周期和所有权,以便两个线程不会同时使用连接。

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

答案 2 :(得分:0)

首先关于您的初始帖子上留下的评论:这与没有没有。它与导轨的设计有关。

有了这个说,你可能会劫持ActiveRecord :: Base行为以保持由密钥索引的连接的哈希值(在你的情况下密钥将是用户名)然后拦截establish_connection以检查池中的连接是否连接已经开放

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

答案 3 :(得分:0)

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

解析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中的开放数据库过多。

我确定你一直在考虑迁移问题。一开始就不是问题&lt; 2000数据库模式。现在有&gt; 15K客户数据库(并且还在增长),因此我们将它们合并回少量分片数据库。