2014-02-28 69 views
5

我在Laravel 4.1中有一个关于处理多个数据库连接的问题。 说我有一个DB主机与主机Laravel 4和MySQL的连接太多

如3个DBS:

'mysql' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'DB_1', 
     'username' => $_ENV['MYSQL_USER'], 
     'password' => $_ENV['MYSQL_PASS'], 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ), 

    'mysql2' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'DB_2', 
     'username' => $_ENV['MYSQL_USER'], 
     'password' => $_ENV['MYSQL_PASS'], 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ), 

    'mysql3' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'DB_3', 
     'username' => $_ENV['MYSQL_USER'], 
     'password' => $_ENV['MYSQL_PASS'], 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ), 

我应该做的那些数据块3个不同的连接?

或者我应该只是有一个连接,并在每个模型指定表名 喜欢的东西:

public $table = "DB_2.table_name"; 

我之所以这样问,是,我已经注意到,我更容易耗尽 数据库连接,因为它创建一个新的数据库连接,当它需要连接到不同的数据库时,它需要 。

我知道两者都有效,但我对这种情况下被认为是“最佳实践”的事情感兴趣。

在此先感谢您的反馈意见。

干杯。

回答

1

指定到表中,而不是数据库实现。

我不是那种允许跨DB在同一台服务器上的数据库之间查询MySQL的'功能'的忠实粉丝。这是什么可以让你提到的东西。

  • 如果您更改了数据库的名称,则需要在代码中重构表名。
  • 如果您创建一个测试数据库像table_name_test对代码进行测试或DB修改,你必须修改所有的表在你的代码每次分贝的对比之间跳转只需要编辑配置文件时间驯服。
  • 如果你移动到一个不同的充DB技术,无需数据库名称(每个服务器/ fuile一个DB,你需要重构每班你的表名属性)
  • 它导致暗下来,诱人又卑鄙的路径的交叉db查询如select * from db1.foo f Join db2.bar b on b.id = f.id;。恭喜你,只是将你的2个数据库变成了一个可能无法在MySQL之外运行的大型数据库

此外,即使您指定了三个连接,您可能也没有建立连接并一次使用全部三个连接。 .. 我希望。如果你确实使用全部3个连接,每个请求给你laravel app/site保存2个连接可能是微型优化。

+0

是的,我认为你是绝对正确的。最终,我们需要重新设计我们的数据模型,以便我们不必为一个工作流程创建多个数据库连接 - 尤其是在单个查询的情况下。 在那之前,我需要做一些让系统免于重载的东西。我遇到的问题是我们有很多并发请求正在处理中。这会导致每个请求最多有3个连接 - 这可能会降低高流量的性能。 – Gimli

+0

@Gimli PDO中没有办法(假设你在laravel中使用它)在相同的连接上“切换”数据库。一旦将dsn传递给构造函数,它就会被设置。 DSN应该有指定的数据库。如果您尝试在$表中使用db名称,则可能会看到如下所示的请求:'select * from DB1.DB2.footable'。 – Ray

+0

@Gimili当然,如果您不使用orm或DQL,则可以使用手动构建的查询来执行此操作。 – Ray

0

当我需要的时候,这段代码为我制造了诀窍。

Config::set('database.default', 'database_name'); 

在你的情况,你可能需要的那些取代数据库名称。每当我看到需要切换时,我都会在控制器中调用它。在查询之前,例如。

我不知道,如果是以往任何时候都做的最好的方式,但它的工作对我来说,我认为这值得分享! = d

+1

虽然这可能会起作用,但我不确定在控制器中建立数据库连接是不错的做法。但是,我不太确定即时打开和关闭连接是最高性能的事情。特别是如果需要查询多个数据库。然后在最糟糕的情况下,您仍然需要3个独立的数据库连接。 – Gimli