Laravel 4.2 打开第二个数据库连接到主数据库

Posted

技术标签:

【中文标题】Laravel 4.2 打开第二个数据库连接到主数据库【英文标题】:Laravel 4.2 open a second database connection to the main database 【发布时间】:2015-05-05 05:19:06 【问题描述】:

我的 laravel 应用程序有一个数据库,但出于以下原因,我需要在 Laravel 中打开两个连接。

我有这个代码:

    $pdo = DB::connection()->getPdo();
    $pdo->setAttribute( PDO::mysql_ATTR_USE_BUFFERED_QUERY, false );

    $query = $pdo->query( "SOME QUERY PULLING MILLIONS OF ROWS" );

    while ( $row = $query->fetch( PDO::FETCH_ASSOC ) ) 
        // Some function that writes the result to file
        // and updates a row in a table to keep track of the process
    

我正在使用无缓冲查询,因为我没有足够的内存来将整个结果集准备到内存中,我们在这里讨论的是数百万行。但是我需要跟踪已经处理了多少行,所以我有一个函数可以每处理 10K 行就写回状态表。问题是当一个无缓冲的查询正在运行时,在它完成之前你不能写回 MYSQL。

所以我需要做的是让上面的这个无缓冲查询运行一个新连接,但与应用程序使用的数据库相同。

那么有可能吗?如何在 Laravel 中启动与应用程序已在使用的同一数据库的新连接,而不关闭现有连接?

【问题讨论】:

我想你已经看到了,但是laravel.com/docs/5.0/database#accessing-connections 但也许DB::connection('foo')->select(...) 可以为你打开一个新的连接。使用DB::disconnect('foo');,您可以断开连接。 @wiesson 我的印象是,这只有在您配置了多个连接时才有效。我只有一个连接“生产”。如果我使用DB::connection('production'),那么它将只使用已经打开的连接,而不是使用新的连接。如果我错了,请纠正我。 我认为您是正确的,但您可以尝试使用相同的凭据定义“prodiction2”并建立连接。这只是我最初的想法,我不知道这是否非常有效,但现在可以工作。 @wiesson 谢谢我有同样的思考过程,并且在我们说话的时候正在测试这个。 @wiesson 好的,这可行,但感觉很hacky,因为我不必要地创建了配置的重复。也许有人有更好的解决方案? 【参考方案1】:

在应用程序配置中创建一个与主数据库具有相同数据库连接详细信息的新数据库连接,并将其命名为不同的名称。

然后在代码中你可以像这样使用第二个连接:

$pdo = DB::connection('connection 2 name here')->getPdo();

如果它尚未打开,这将打开一个新连接。

【讨论】:

以上是关于Laravel 4.2 打开第二个数据库连接到主数据库的主要内容,如果未能解决你的问题,请参考以下文章

Tableau Desktop 日常问题 5.0打开第二个 Tableau 桌面实例时出现错误“连接错误:Tableau 无法连接到数据源“

laravel如何检查表中的记录连接到用户表

如何将带有前缀列的表连接到 PHP MySQL 或 Laravel 中的另外两个表

当多个用户连接到数据库时,VB6 数据库操作变慢

连接到广播IP地址

-连接到WAN