如果第一个失败,我可以连接到第二个数据库主机吗?

3PSY0N

如果第一个故障或连接限制达到,我有一个关于连接到第二个主机的问题。

我的主机在法国的共享主机上是 OVH(我无法修改apache/php/sql config),并且MAX USER_CONNECTIONS (sql)是 30。

我想切换主机是第一个达到限制并拒绝连接。

我可以用吗 ?:

$dbhost = 'localhost';
$dbname = 'dbname';
$dbuser = 'dbuser';
$dbpswd = 'dbpass';
try{
    $db = new PDO('mysql:host='.$dbhost.';dbname='.$dbname,$dbuser,$dbpswd,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}catch(PDOexception $e){
    $dbhost2 = 'secondhost';
    $dbname2 = 'dbname';
    $dbuser2 = 'dbuser';
    $dbpswd2 = 'dbpass';
    try{
        $db = new PDO('mysql:host='.$dbhost2.';dbname='.$dbname2,$dbuser2,$dbpswd2,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    }catch(PDOexception $e){
        die("DB Error please contact the web admin.");
    }
}

或者如果你有更好的选择..

注意:我没有太多的编程经验,我还没有使用 OOP。

你的常识

这个想法是对的,但这个特定的实现是不灵活的,对应该修复错误的站点管理员没有帮助。

想象一下主服务器的密码已更改的情况。由于无条件算法,您的代码将开始 100% 的时间连接到备份服务器,并且没有人对此有任何想法。

鉴于您想克服特定错误(“连接过多”),在您的 catch 块中,您应该测试它是否是您期望的错误,否则至少记录错误消息。所以站点管理员会注意到一个问题,并且会知道发生了什么。

die("DB Error please contact the web admin."); 对于站点管理员来说也没有多大用处,因为他不知道备份服务器发生了什么。

因此,对于第二个,不要立即捕获其异常,而是遵循站点的常见错误处理例程。最简单的方法是对整个代码进行全局 try catch,这看起来相当生硬,但至少比几十个本地 try catch 更好,每个都有自己的错误消息

所以它应该像

$dboptions = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)

try{
    $db = new PDO("mysql:host=$dbhost;dbname=$dbname;charset=utf8mb4",$dbuser,$dbpswd,$dboptions);
}catch(PDOexception $e){
    if ($e->getMessage() != "whatever particular error message you get") {
        error_log($e);
    }
    $dbhost2 = 'secondhost';
    $dbname2 = 'dbname';
    $dbuser2 = 'dbuser';
    $dbpswd2 = 'dbpass';
    $db = new PDO("mysql:host=$dbhost2;dbname=$dbname;charset=utf8mb4",$dbuser,$dbpswd,$dboptions);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

2个数据库。如果第一个不存在值,则在第二个中查找/搜索

输入框提示第二个数据条目存储数据,我们可以让它存储在第一个条目上吗?

Codeigniter 基于第一个 DB 连接到第二个 DB

如果第一个函数失败,则应用第二个函数

grails如何(重新)连接到第二个数据库

如果第一个数据帧中存在行,如何更新第二个数据帧的存在值

SQL:如何在更新第一个数据库中的表时自动在第二个数据库中更新表?

返回第一个表中的所有数据,如果存在,则仅返回第二个表中的1个数据

在对列表中,如果第二个数字相同,我如何对第一个数字进行排序?

两个数据帧之间的条件格式,在第二个数据帧中,如果条件对第一个数据帧有效,我想备注为真

如何从第一个接口与连接到第二个接口的设备共享Internet?

Php,使用第一个键和第二个值连接两个数组

Spring Integration-如果第一个事务失败,则回滚第二个事务

如果第一个验证器失败,如何停止执行第二个验证器?

POST请求可以接受两个回调,并且第一个可以将数据传递给第二个吗?

如果我在方法中有两个等待Task.Run(),第二个将等待第一个完成吗?

标识第二个数据框中的行的值小于第一个

用户登录后动态连接到第二个数据库-python Flask

如果我不更改第一个下拉列表,则第二个下拉列表的值不变

如果我更改第一个下拉值,如何重置第二个下拉列表?

模拟第一个呼叫失败,第二个呼叫成功

第一个DAG中的节点可以执行第二个condor_submit_dag吗?

如果第一个输入聚焦,则将第二个输入

左联接中的两个表都具有id字段。尝试从第一个数据库中提取ID字段,但改为获取第二个

我可以立即停止第一个 UIView 动画并在同一视图上启动第二个动画吗?

如何在您最好从数据库/excell 中选择第一个列表中的项目后填充第二个列表

只能插入第一个和第二个值,其他值不能插入数据库。如何解决这个问题?

我想在颤振中将数据从第二个屏幕传递到第一个屏幕

为什么我的第二个块坚持第一个?