[英]How to set second database in laravel when main connection is down
我有一个 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 服务器,它仍然会抛出数据库名称
对于这个答案,我正在考虑 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 将随机选择连接的主机之一并尝试连接到它们。 如果尝试失败,它将继续尝试直到找不到更多主机。
您可以在 app/config/database.php 中定义两个 mysql 连接,并使用中间件定义应该连接到的数据库。
您可以在此 URL 中找到更详细的解释:
http://fideloper.com/laravel-multiple-database-connections
我最近开始搜索相同的东西并尽快更改连接,您可以
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 文档以获取更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.