【发布时间】:2023-03-10 07:23:01
【问题描述】:
我的 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,因为我不必要地创建了配置的重复。也许有人有更好的解决方案?
标签: mysql database laravel pdo unbuffered-queries