我正在尝试了解连接数据库的最佳方法。
目前我有一个解析URL的方法(取决于称为应用程序的URL必须连接到不同的数据库,如customer1.example.com将连接到customer1数据库)并调用
ActiveRecord::Base.establish_connection(conn_string)
其中conn_string包含数据库的名称。
使用
调用此方法(set_db)before_filter :set_db
在我的应用程序控制器中,所以基本上对于我得到的每个请求,解析URL并且应用程序尝试执行establish_connection。
我想知道我是否可以在某个地方建立连接池....你有什么建议吗?有一个Singleton可以保持所有连接并返回正确的连接吗?
谢谢! 罗伯特
答案 0 :(得分:1)
数据库是否在同一台服务器上?
我有一个应用程序,其中一些模型对象来自一个数据库,而另一些来自不同的数据库。我重写table_name函数来指定数据库。如果它们是不同的服务器但不适用于同一服务器中的不同数据库,则无效。
class xx < ActiveRecord.base
def self.table_name
"otherdatabase.table"
end
看起来数据库池可能正在为一个升级版本的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客户数据库(并且还在增长),因此我们将它们合并回少量分片数据库。