【问题标题】:How to set second database in laravel when main connection is down主连接断开时如何在laravel中设置第二个数据库
【发布时间】:2017-02-12 18:52:41
【问题描述】:

我有一个 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 服务器,它仍然会抛出数据库名称

【问题讨论】:

    标签: php sql sql-server laravel


    【解决方案1】:

    对于这个答案,我正在考虑 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 会随机选择一个连接的主机并尝试连接到它们。如果尝试失败,它会继续尝试,直到找不到更多主机。

    【讨论】:

      【解决方案2】:

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

      你可以在这个网址找到更详细的解释:
      http://fideloper.com/laravel-multiple-database-connections

      【讨论】:

        【解决方案3】:

        我最近开始搜索相同的东西并尽快更改连接,您也可以

        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 了解更多信息。

        【讨论】:

          猜你喜欢
          • 2023-03-10
          • 2020-01-10
          • 1970-01-01
          • 1970-01-01
          • 2013-10-20
          • 1970-01-01
          • 1970-01-01
          • 2019-04-15
          • 2014-05-24
          相关资源
          最近更新 更多