如何在主连接断开时在laravel中设置第二个数据库

时间:2016-10-04 14:37:09

标签: php sql sql-server laravel

我有一个laravel项目,与不同的IP有很多联系。

我希望laravel在主SQL服务器关闭的情况下连接到备份数据库

实施例

192.168.1.2 -> SQL DB #1
192.168.1.3 -> SQL DB #1 Backup

如果192.168.1.2发生故障,则laravel必须连接到192.168.1.3

我想在database.php文件中执行此操作,但我认为这是不可能的。

在尝试这样的查询之前,我试图测试连接:

if(DB::connection('connection')->getDatabaseName())

但似乎它将数据保存在缓存中,即使我关闭了SQL服务器,它仍会抛出数据库名称

3 个答案:

答案 0 :(得分:0)

您可以在app / config / database.php中定义两个mysql连接 使用中间件,您可以定义应该连接的数据库。

您可以在此网址中找到更详细的说明:
http://fideloper.com/laravel-multiple-database-connections

答案 1 :(得分:0)

我最近开始搜索相同的内容,并尽快更改连接

try{
    \DB::connection()->getPdo();                 // check if we have a connection
}catch{
    \DB::purge(config('database.default'));      // disconnect from the current
    \DB::setDefaultConnection('my-fallback-db'); // connect to a new one
}

还要检查laravel api docs以获得更多信息。

答案 2 :(得分:0)

为此,我正在考虑使用Laravel 5。

通过调试模型查询,我发现Laravel连接不支持单个主机,而是支持它们的列表。

[
    'driver' => 'sqlsrv',
    'host' => [
        '192.168.1.2',
        '192.168.1.3',
    ],
    'database' => 'database_name',
    'username' => 'username',
    'password' => 'password',
    'charset' => 'utf8',
    'prefix' => '',
    'prefix_indexes' => true,
    'transaction_isolation' => PDO::SQLSRV_TXN_READ_UNCOMMITTED, // Not required, but worth mentioning it's possible to define it here too
    'options' => [],
]

Laravel连接解析背后的基础方法是Illuminate\Database\Connectors::createPdoResolverWithHosts,它具有以下行为:

protected function createPdoResolverWithHosts(array $config)
{
    return function () use ($config) {
        foreach (Arr::shuffle($hosts = $this->parseHosts($config)) as $key => $host) {
            $config['host'] = $host;

            try {
                return $this->createConnector($config)->connect($config);
            } catch (PDOException $e) {
                continue;
            }
        }

        throw $e;
    };
}

这种行为意味着Laravel将随机选择连接的主机之一并尝试连接到它们。如果尝试失败,它将继续尝试直到找不到更多主机为止。