【问题标题】:Check if a server is available检查服务器是否可用
【发布时间】:2009-03-05 11:04:43
【问题描述】:

我正在寻找一种方法来检查服务器是否仍然可用。 我们有一个在服务器上保存数据的离线应用程序,但是如果服务器连接断开(偶尔发生),我们必须将数据保存到本地数据库而不是在线数据库。 所以我们需要继续检查服务器是否仍然可用。

我们在这个应用程序中使用 C#

检查sqlconnection.open 并不是一个真正的选择,因为这需要大约 20 秒才能引发错误,我们不能等这么久 + 我也在使用一些 http 服务。

【问题讨论】:

    标签: c#


    【解决方案1】:

    只需使用System.Net.NetworkInformation.Ping 类。如果您的服务器不响应 ping(由于某种原因您决定阻止 ICMP Echo 请求),您将不得不为此发明自己的服务。就个人而言,我完全赞成不阻止 ICMP Echo 请求,我认为这是要走的路。 ping 命令已被用于检查主机的可达性

    using System.Net.NetworkInformation;
    var ping = new Ping();
    var reply = ping.Send("google.com", 60 * 1000); // 1 minute time out (in ms)
    // or...
    reply = ping.Send(new IPAddress(new byte[]{127,0,0,1}), 3000);
    

    【讨论】:

    • 一个问题可能是路由器/交换机回复 ping,或者数据库服务本身已经崩溃。
    • 两者似乎都不太可能,服务不应该在服务器崩溃的情况下真正失败。必须设置网络,以便 ping 作为可访问性的可靠测试。
    • 如果 ping 失败,可能是防火墙问题(防火墙和 NAT 路由器丢弃 ping 请求并不少见)。如果 ping 成功,则数据库服务仍可能关闭。因此,ping 对测试服务的可用性没有用处。
    • 我同意 DonkeyMaster 的观点,人们说 ping 并不总是检查服务器是否仍在运行的正确方法。
    • 我同意 DonkeyMaster 的观点,这是他感兴趣的数据库。所以他确实需要检查这一点,而不仅仅是服务器响应 PING
    【解决方案2】:

    如果连接像你说的那样不可靠,我不会使用单独的检查,而是将数据保存在异常处理的本地部分。 我的意思是,如果连接失败并引发异常,您可以切换策略并将数据保存在本地。

    如果您先检查然后连接断开(当您实际保存数据时),那么您仍然会遇到需要处理的异常。所以最初的检查是不必要的。仅当您可以假设在成功检查后连接已启动并保持正常时,检查才会有用。

    【讨论】:

      【解决方案3】:

      从您的问题看来,连接到服务器的目的是使用其数据库。您的首要任务必须是检查您是否可以成功连接到数据库。无论您是否可以PING 服务器或获得HTTP 响应(如其他答案中所建议),您的进程都会失败,除非您成功建立与数据库 的连接。您提到检查数据库连接需要的时间太长,为什么不将应用程序连接字符串中的Connection Timeout 设置更改为更不耐烦的值,例如 5 秒 (Connection Timeout=5)?

      【讨论】:

      • 这不会影响查询的执行时间吗?我们有一些脚本需要 10 秒......超时 5 秒会崩溃吗?
      • 是的,您是正确的,但我建议您仅将这个缩短的连接超时用于您的初始“探测”,以检查服务器和数据库是否处于活动状态。之后,使用更合理的超时时间进行连接。
      【解决方案4】:

      如果这是一个 sql server,那么你可以尝试打开一个新的连接。如果 SqlConnection.Open 方法失败,那么您可以检查错误消息以确定服务器是否不可用。

      【讨论】:

        【解决方案5】:

        你现在做的是:

        • 使用远程服务器
        • 如果远程服务器出现故障,请使用本地缓存

        如何判断服务器是否可用?使用 catch 块。这是最简单的编码。


        如果您实际上有一个本地数据库(而不是,例如,等待插入的事务或数据列表),我会改变设计:

        • 使用本地数据库
        • 定期同步本地数据库和远程数据库

        我会让你判断并发约束和其他与你的应用程序相关的东西来选择解决方案。

        【讨论】:

          【解决方案6】:

          由于您想查看数据库服务器是否存在,或者在您尝试连接到数据库时捕获任何错误,或者使用套接字并尝试在某些服务上与服务器建立原始连接,所以我建议您使用数据库是您需要的资源。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多