Die MySQL - Verbindung zur Laufzeit überprüfen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von raist10.

    Die MySQL - Verbindung zur Laufzeit überprüfen

    Hallo Community,

    vorab vielen Dank an die Administration für die Bereitsstellung dieses Forums. Das Aufbringen der Kosten, sowie Zeit für Wartung und Administration rechne ich euch hoch an.

    Dennoch muss ich auch sofort eine Frage an die Erfahrenen User stellen. Ich habe zuvor in C++ und auch in Java Erfahrungen gesammelt und will jetzt nochmal auf die (vor Schläge fürcht) kleineren Programmiersprachen zurückgreifen. Ich möchte ein kleines Tool schreiben, was auf eine Datenbank zugreift wo Werte verändert bzw. eingetragen werden können. (Logisch eigentlich :thumbdown: ).

    Die Verbindung steht auch, aber die Session zum TimeOut beträgt durch den Connector automatisch 30 Sekunden (?!).

    1. Wie kann ich dieses Timeout hochsetzen? Ich weiß, dass es im ConnectionString gleich eingestellt werden muss, aber so wie mir das laut MSDN vorgeschlagen wurde, wollte das nicht. Probiere es gleich ansonsten nochmal.
    2. Wie kann ich während der Laufzeit des Programms überprüfen, ob die Verbindung zur Datenbank noch besteht? Hab die Idee gehabt über den Fehlercode #2006 - Server has gone away zu lösen. Wie kann ich die Verbindung denn immer wieder und wieder testen? Es gab allen Anschein nach bisher keine Funktion namens: .status oder ähnliches. Eine Idee? Nur der Funktionsname wäre super.

    Ich wünsche allen einen schönen Rest-Sonntag und einen angenehmen Start in die neue Arbeitswoche.

    Mit freundlichen Grüßen,

    André - Elexarie.

    Ich weiß, dass es im ConnectionString gleich eingestellt werden muss, aber so wie mir das laut MSDN vorgeschlagen wurde, wollte das nicht. Probiere es gleich ansonsten nochmal.


    Eine andere Möglichkeit als gleich beim Connection-String den Connection TimeOut mitzugeben wäre mir nicht bekannt.

    Wäre auch unlogisch, da ja der TimeOut gleich beim ersten Zugriff auf die DB funktionieren sollte.

    Wo ist aber mit 30 Sekunden Dein Problem? Wenn Connection.Open nach 30 Sekunden keine Antwort vom Server bekommt und deswegen failed macht es auch wenig Sinn den TimeOut auf 60 Sekunden rauf zu setzen.

    Bau doch lieber einen Abfang rein ... wenn nach 30 Sekunde der TimeOut zuschlägt dann Msg an User und fragen was tun: Nochmal probieren oder abbrechen.


    Wie kann ich während der Laufzeit des Programms überprüfen, ob die Verbindung zur Datenbank noch besteht? Hab die Idee gehabt über den Fehlercode #2006 - Server has gone away zu lösen. Wie kann ich die Verbindung denn immer wieder und wieder testen? Es gab allen Anschein nach bisher keine Funktion namens: .status oder ähnliches. Eine Idee? Nur der Funktionsname wäre super.


    ConnectionState wäre eigentlich schon die richtige Funktion.

    Aber wieso immer und immer wieder testen? Das wäre doch unsinnig.

    Ich formuliere es mal so: Wenn Du auf eine DB zugreifst wirst Du das ja eh über eine Connection-Klasse lösen. Die instanzierst Du ja wenn Du die Connection brauchst und das öffnet ja dann eh selbstständig die Connection. Und wenn nicht mehr gebraucht, dann wird das Objekt/die instanzierte Klasse auch wieder zerstört.

    Wieso nun prüfen ob Connection besteht? Stellst Du ja eh bei jeder Klassen-Instantzierung fest wenn Du für die Instanz Connection.Open ausführst.

    Oder verstehe ich gerade Deine Problemstellung falsch?

    @ picoflop


    Wenn man sie ordnungsgemäß closed, sollte der wohl "closed" sein ;)
    Ob eine Verbindung zum DB Server besteht, merkt man, wenn man versucht eine Connection zu öffnen.


    Wenn ich es richtig verstanden habe, geht es nicht darum ob der DB-Server "zugriffsfähig" ist, sondern darum zu prüfen ob eine bereits geöffnete Connection noch "lebt".

    Die kann ja durchaus durch Inaktivität automatisch getrennt werden ohne das man sie selber geclosed hat. Wenn man nun auf die Connection zu greift wäre es schon sinnig wenn man über die ConnectionState Eigenschaft zuvor prüft ob die Verbindung wirklich noch open ist oder bereits closed oder gar broken, bzw. auch vor Zugriff prüft ob die Verbindung vllt nicht noch in Gebrauch ist (also State Executing oder Fetching).

    Aber an sich hast Du schon Recht, in Zeiten von NET und OOP macht es wenig Sinn eine Connection über eine Public (Shared) Property oder als Public Member in der gesamt App für den Datenbankzugriff zu nutzen sondern sie mit jeder Objekterstellung der Zugriffs-Klasse eine neue Connection zu nutzen. Einzig und alleine könnte das Problem sein, dass man der Arbeitsgeschwindigkeit zu liebe bei langsamer Verbindung zum DB-Server nicht unbedingt für jeden Zugriff eine neue Connection öffnen will die immer wieder auf's Neue mehrere Sekunden für den Aufbau braucht.

    Naja ... mal gucken was der TE sagt.

    Gruß

    Rainer
    Korrekt. Ich spreche davon zu überprüfen, ob die Verbindung zum Server während der offenen Session noch verfügbar ist. Das heißt, den Status abzurufen:

    Pseudocode:

    VB.NET-Quellcode

    1. if (MySQl gibt noch immer antwort = true) then
    2. mach weiter wie gehabt
    3. else
    4. conn.close()
    5. erneuter Login + Wiederaufbau


    Aber anscheinend bleibt die Connection ja daueroft bestehen? Man muss doch in einer Endlosschleife überprüfen können, wie der Status ist.
    Konrekter: Wenn ich das Programm starte und dann essen gehe, ist die Verbindung doch irgendwann weg. Wie, wenn ich irgendwie was bezahle über PayPal und da steht: Ihre Sitzung ist abgelaufen. Loggen sich erneut ein.

    Elexarie schrieb:


    Man muss doch in einer Endlosschleife überprüfen können, wie der Status ist.


    Das ist aber kompletter Schwachsinn da eine Dauerschleife laufen zu lassen.


    Konrekter: Wenn ich das Programm starte und dann essen gehe, ist die Verbindung doch irgendwann weg.


    Ja, aber das regelt man über das Thema OOP und einer eigenen Zugriffsklasse. Alle Funktionen die einen zugriff auf die DB benötigen holen sich eine Instanz der Zugriffsklasse. Im Constructor New der Zugriffsklasse wird jedesmal eine Verbindung geöffnet und die wird erst wieder geschlossen wenn die Instanzierung aufgehoben wird (z.B. über die Implementierung der Schnittstelle IDisposable).

    Und innerhalb der Zugriffsklasse stellst Du in einer Property die Connection den Instance-Holdern zur Verfügung. Jetzt kannst Du bei jedem Zugriff auf die Connection prüfen ob sie noch "lebt", wenn nicht dann closen und erneut verbinden und erst nach der erneuten Verbindung die Connection zurück geben.

    Damit hast Du alles in trockenen Tüchern. ;)

    Gruß

    Rainer

    singu schrieb:

    Wo befindet sich der MySQL-Server, bei dir auf dem PC oder bei einem Webhoster? Wenn andere Leute das Programm verwenden, empfehle ich, und bestimmt auch andere, dir das ganze über ein PHP-Skript laufen zu lassen.

    Das Team bekommt ein kleines Programm, mit dem einfach nur eine Menge einer Ware eingetragen werden. Mehr nicht. Über PHP soll das dann später aufgerufen werden und auf der Webpräsenz angezeigt werden.

    Das heißt, durch den Constructer bleibt die Verbindung ohne weiteres zutun bestehen?

    Elexarie schrieb:

    singu schrieb:


    Das heißt, durch den Constructer bleibt die Verbindung ohne weiteres zutun bestehen?


    Nein, natürlich nicht ... durch den Constructor wird nur veranlasst das bei jeder Instanzierung eine Verbindung geöffnet wird. Das die Verbindung am Leben bleibt, besorgt dann die Abspeicherung in einem Klassen-Member. In etwa so (jetzt frei aus dem Bauch raus und ohne IDE, also Syntaxfehler sind möglich ... bei ConnectionState passt natürlich die Syntax für die Enumeration nicht, bin aber gerade zu faul nachzugucken ;) :(

    VB.NET-Quellcode

    1. Public Class MyConnection
    2. Implements IDisposable
    3. Public Sub New()
    4. OpenCon
    5. End Sub
    6. Private m_con As SQLConnection
    7. Public ReadOnly Property Con() As SQLConnection
    8. Get
    9. if m_con.ConnectionState = Closed then
    10. m_con = nothing
    11. OpenCon
    12. End if
    13. if m_con.ConnectionState = Broken then
    14. m_con.Close
    15. m_con = nothing
    16. OpenCon
    17. End if
    18. Return m_con
    19. End
    20. End Property
    21. Private Sub OpenCon()
    22. m_con.ConnectionString = "<Connection-String hier>"
    23. m_con.Open
    24. End Sub
    25. Private Sub CloseCon()
    26. m_con.Close
    27. m_con = Nothing
    28. End Sub
    29. '// ... hier die Methoden der IDisposable-Schnittstelle, die dann die Sub CloseCon aufrufen
    30. End Class


    Wird die Klasse instanziert erstellt sie automatisch eine neue Connection, wird sie mit Class.Dispose "entlassen" wird die Connection geclosed.

    Bei jedem Zugriff auf die Property Con überprüft diese den Status bevor sie die Connection zurück gibt. Ist der Status Broken oder Closed wird die Connection wieder neu aufgebaut bevor sie zurück gegeben wird.

    Damit wären alle Deine Probleme die Du hier geschildert hast erledigt. ;)

    Gruß

    Rainer