- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我遇到这样一种情况,我们有两个相互同步的生产数据库。服务器一被认为是主要的。有时由于维护或灾难,服务器二将成为主要服务器。
在我们的一些代码中,这意味着我们必须手动进入并编辑数据库连接的服务器名称。我觉得这很烦人,所以我写的最后一件事是为两者放置服务器信息并设置一个循环。如果 oci_connect 在服务器一上失败 3 次,它将移至服务器二。如果服务器二失败 3 次,它会通知用户无法建立连接。
在我们遇到切换服务器的情况时,这在大多数情况下都运行良好。例如,昨天它运行良好。今天没有。它只是不停地坐着旋转。 PHP 错误日志中没有错误。没有失败继续前进。没有错误输出到屏幕。 5 分钟内什么都没有。
然后我不得不手动编辑愚蠢的配置文件。
我问可能有什么不同,我被告知“昨天数据库宕机了,但服务器没宕机。今天服务器宕机了。”好的...?但我看不出有什么区别。如果不能与服务器建立任何类型的通信,我希望 oci_connect 返回 false。我希望它超时和错误。当它从服务器收到错误代码时,不只是传递它。例如,如果出现网络问题怎么办?
这是 oci_connect 中的一个错误,还是我们的 PHP 配置中的某些东西可能给 oci_connect 一个疯狂的长超时?
如果它是一种“错误”,我可以通过某种方式检查服务器是否已启动?像 ping? (当然,当我通过命令提示符执行 ping 操作时,我收到了服务器一号的响应,然后被告知“它现在回来了”,尽管我对此时间持怀疑态度。)
无论如何,如果有人能阐明为什么 oci_connect 可以无休止地运行而不会失败,以及如何防止它失败,我将不胜感激。
--编辑:我的代码仅在某些循环中看起来像 PHP.net 上的示例。
$count = count($servers);
for($i = 0; $i < $count; $i++){
if((!isset($connection)) || ($connection == false)){
// Attempt to connect to the oracle database
$connection = @oci_connect($servers[$i]["user"], $servers[$i]["pass"], $servers[$i]["conid"]) or ($conn_error = oracle_error());
// Try again if there was a failure
if(($connection == false) || (isset($con_error))){
// Three (two more) tries per alternative
for($j = $st; $j < $fn; $j++){
// Try again to connect
$connection = @oci_connect($servers[$i]["user"], $servers[$i]["pass"], $servers[$i]["conid"]) or ($conn_error = oracle_error());
} // for($j = 2; $j < 4; $j++)
} // if($connection == false)
} // if(!isset($connection) || ($connection == false))
} // for($i = 0; $i < $count; $i++)
最佳答案
你能确认它没有返回 false 吗?它可能只是在等待连接时阻塞吗? (如果你执行 var_dump(oci_connect(...))
会发生什么?
来自 php.net 的 documentation :
If you want to specify a connection timeout in case there is network problem, you can edit the client side (e.g. PHP side) sqlnet.ora file and set SQLNET.OUTBOUND_CONNECT_TIMEOUT. This sets the upper time limit for establishing a connection right through to the DB, including the time for attempts to connect to other services. It is available from Oracle 10.2.0.3 onwards.
In Oracle 11.1, a slightly lighter-weight solution TCP.CONNECT_TIMEOUT was introduced. It also is a sqlnet.ora parameter. It bounds just the TCP connection establishment time, which is mostly where connection problem are seen.
The client sqlnet.ora file should be put in the same directory as the tnsnames.ora file.
此外,您可能想查看 FAN on this page ...看起来它可能完全符合您的要求(但我没有这方面的经验,所以我不确定它是否真的适合您)。
关于php - 为什么 PHP 的 oci_connect 不返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2922118/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!