Ich suche nach einer Möglichkeit zu überprüfen, ob ein Server noch verfügbar ist. Wir haben eine Offline-Anwendung, die Daten auf dem Server speichert, aber wenn die Serververbindung abbricht (was gelegentlich passiert), müssen wir die Daten in einer lokalen Datenbank anstatt in der Online-Datenbank speichern. Wir brauchen also eine fortlaufende Überprüfung, um zu sehen, ob der Server noch verfügbar ist.
Wir verwenden C # für diese Anwendung
Die Überprüfung auf sqlconnection.open
ist nicht wirklich eine Option, da dies etwa 20 Sekunden dauert, bevor ein Fehler ausgelöst wird. Wir können nicht so lange warten + Ich benutze auch einige http-Dienste.
Verwenden Sie einfach die System.Net.NetworkInformation .Ping Klasse. Wenn Ihr Server nicht auf Ping reagiert (aus irgendeinem Grund haben Sie sich entschieden, die ICMP Echo-Anfrage zu blockieren), müssen Sie dafür einen eigenen Dienst erfinden. Persönlich bin ich dafür, ICMP-Echo-Anfragen nicht zu blockieren, und ich denke, das ist der Weg zu gehen. Der Ping-Befehl wurde seit Ewigkeiten verwendet, um die Erreichbarkeit von Hosts zu überprüfen.
%Vor%Wenn die Verbindung so unzuverlässig ist, wie Sie sagen, würde ich keine separate Prüfung verwenden, sondern das Speichern des lokalen Datenbereichs der Ausnahmebehandlung machen . Ich meine, wenn die Verbindung fehlschlägt und eine Ausnahme auslöst, wechseln Sie Strategien und speichern Sie die Daten lokal.
Wenn Sie zuerst prüfen und die Verbindung danach abbricht (wenn Sie tatsächlich Daten speichern), würden Sie immer noch auf eine Ausnahme stoßen, die Sie behandeln müssen. Also war die erste Überprüfung unnötig. Die Überprüfung wäre nur dann sinnvoll, wenn Sie davon ausgehen, dass nach erfolgreicher Überprüfung die Verbindung aufgebaut ist und bleibt.
Aus Ihrer Frage geht hervor, dass der Zweck der Verbindung mit dem Server darin besteht, seine Datenbank zu verwenden. Ihre Priorität muss sein, zu überprüfen, ob Sie erfolgreich eine Verbindung zur Datenbank herstellen können. Es spielt keine Rolle, ob Sie PING
auf dem Server oder eine HTTP
response (wie in anderen Antworten vorgeschlagen) erhalten, Ihr Prozess wird fehlschlagen, wenn Sie keine Verbindung zur Datenbank herstellen. Sie erwähnen, dass das Überprüfen einer Datenbankverbindung zu lange dauert. Warum ändern Sie nicht einfach die Einstellung Connection Timeout
in der Verbindungszeichenfolge Ihrer Anwendung auf einen ungeduldigeren Wert wie 5 Sekunden ( Connection Timeout=5
)?
Wenn dies ein SQL-Server ist, dann können Sie einfach versuchen, eine neue Verbindung zu ihm zu öffnen. Wenn die SqlConnection.Open-Methode fehlschlägt, können Sie die Fehlernachricht überprüfen, um festzustellen, ob der Server nicht verfügbar ist.
Was Sie jetzt tun, ist:
Wie ermittelt man, ob der Server verfügbar ist? Verwenden Sie einen Fangblock. Das ist am einfachsten zu programmieren.
Wenn Sie tatsächlich eine lokale Datenbank haben (und nicht zum Beispiel eine Liste von Transaktionen oder Daten, die darauf warten eingefügt zu werden), würde ich das Design umdrehen:
Ich werde Sie in Bezug auf Parallelitätsbeschränkungen und andere Dinge, die mit Ihrer Anwendung zusammenhängen, beurteilen, um eine Lösung zu finden.
Da Sie sehen möchten, ob der Datenbankserver entweder Fehler beim Versuch, eine Verbindung zur Datenbank herzustellen oder einen Socket und eine rohe Verbindung mit dem Server auf einem Dienst versuchen, würde ich vorschlagen, die Datenbank als solche ist die Ressource, die Sie brauchen.
Tags und Links c#