GoTo Loops für MySql Connect ratsam ?

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Moin Leute,


    da das mein erster Beitrag ist stelle ich mich hier gleich mal mit vor, ich bin Tom, 19 Jahre alt und
    bin Student / Webdeveloper (hauptsäch. PHP OOP / Html, xHtml / CSS / JS ).
    Nebenbei Programmiere ich in C#, C++ und ab und zu in Visual Basic obwohl mir
    das Objektorientierte besser liegt.


    Ich machs kurz, ich hab mich jetzt das erste mal Pawno angewurfen und einfach drauf los gescriptet.
    Ich habe schon bisschen die Foren durchsucht aber keine Pro's/Contras für die verwendung von While / GoTo schleifen gefunden.
    Macht es Sinn solche zu verwenden und sind sie denn performant ?


    Ich sehe hier schon einen kleinen Performanceabfall:



    public DatabaseConnect()// Bitte mysql_reconnect verwerden - ansonsten Verbindung vorher schliessen (mysql_close)
    {
    mysql_connect(SQL_HOST, SQL_USER, SQL_DATA, SQL_PASS);
    Mysql_Con:
    if ( !mysql_ping() && MYSQLCONFAILURE < MYSQLCONFAILURELIMIT )
    {
    MYSQLCONFAILURE++;
    printf("[ <MYSQL> Verbindung konnte nicht hergestellt werden - Reconnect versuch %d ]", MYSQLCONFAILURE);
    mysql_reconnect();
    goto Mysql_Con;


    }else if( !mysql_ping() && MYSQLCONFAILURE >= MYSQLCONFAILURELIMIT ){
    printf("[[ <MYSQL> Verbindung konnte nicht hergestellt werden. Server wird beendet.");
    mysql_close();
    SendRconCommand("exit");
    }else{
    printf("[ <MYSQL> Verbindung zum Mysql Server wurde erfolgreich hergestellt.");
    }
    }


    Was meint ihr ? Goto's verwenden oder selber eine static function basteln, quasi als Workarround ?


    MFG Rhizon

  • ICh würde es mit einer schleife lösen die sich nicht mehr wie 3 mal durchläuft


    Man könnte es hier auch mit einem Timer lösen und so Datenverlust bei Verbindungsabbruch zu verhindern

  • Über die MYSQLCONFAILURELIMIT Variable kann man ja den Recon Ammount einstellen.
    Durch Datenbank Caching und ein MySql Plugin bin ich im falle eines Servercrashes abgesichert,
    da die komplette Datenbank bis zum letztem vollständigem Query zurück gesetzt und die
    gecachten Daten eingefügt werden.

  • was sind bitte "Crownjobs" oder meinst du Cronjobs? Wenn ja wie löst du das in irgend einer Sprache Errors oder ähliches zu bekommen um den Tread zu unterbrechen?


    Ein Timer hat immer mehr Preformance da die betroffene Funktion nicht Permanent läuft sondern immer in einem Bestimmten Zeitmuster läuft ohne das dass Programm dort hängen bleibt.


    nehmen wir mal C wenn wir dort ein Loop(schleife) erstellen, bleibt die Anwendung solang bei dem Loop bis dieser per Break unterbrochen wird, Das gleiche wär wenn du per Goto bei Misserfolg wieder die gleiche Funktion aufrufst. Sowas ist nur beim Starten von vorteil um Funktionen die du benötigst zu checken. ODer Aufgaben im Autoexec teil zu erledigen. Bei einem Timer würden die weiteren Funktionen weiter aufrufbar sein ohne das der Tread hängt.


    Also ob du nun mit Goto dieses hier löst oder per Loop ist hier irelevant, beides lässt die Anwendung an der Stelle Stoppen bis ein Positives ergebniss vorliegt

  • Genau du sprichst es an, durch Libarys oder auch Multithreading kann ich schleifen immer in einen eigenen Thread packen.
    Ein Timer läuft in der Hauptapplikation ( üblicher Weise ebend da wo er gebraucht wird, nicht extern ) und dass Immer (sofern er gestartet wurde).
    Es kommt auch immer auf die Anwendung an, ich diesem Fall halte ich es nicht für ratsam einen Timer beim Connect zu verweden.
    Ich verbinde nicht zu einem externen MySql Server, die übertragunsrate liegt bei über 10Mbits.


    Ich loope also 3 Verbindungsversuche, entweder:


    1) Eine Verbindung wird aufgebaut
    2) Zugangsdaten Falsch
    3) Server Offline


    Dies ist im Normalfall auch in 3 Sekunden nicht behoben.
    Für den Fall eines disconnects des MySql Servers hat die Mysql.dll
    die funktion reconnect die eingeschalten wird, insofern die Verbindung unterbrochen wurden.


    Es geht mir hier rein um die Performance, ich verbinden genau 1 mal, das beim Server Startup, den
    rest regelt das Plugin. Bevor ich einen Intialisierten Timer nutzlos verfügar hab, dachte ich für die eine
    Sekunde in der Verbunden wird würde das die beste Lösung sein.


    Dein Argument das Loopings die Application "Stoppen" ist bei gescheiter/moderner Programmierung einfach nicht
    richtig.

  • Da wir aber hier bei Pawn sind, Pawn veraltert ist und nicht mehr UpToDate, würde cih hier immernoch den Loop nehmen


    • sparst du dir zwei Zeilen (Funktion + Funktionsaufruf)
    • ist es ergo völlig egal was du nimmst, da eh bei Fehlerhafter ausgabe das Script beendet wird
    • ISt der Loop meines wissens genauso schnell wie der Funktionsaufruf.


    ISt es hier eine reine Geschmackssache. Die IDeee mit dem Timer hat den Aspekt, das du den Timer so nutzen kannst, um zu schauen ob die Verbindung noch Aktive ist (ohne kentnisse des Aufbaues der sql.dll die du nutzt.

  • Dafür gibs doch sowieso den "Ping" befehl.
    Es ist doch eh ratsamer, zu testen ob die Verbindung besteht, wenn man sie brauch,
    als permanent in einem Zeitintervall auch wenn es zu dem Zeitpunkt eventuell nicht nötig ist.

  • Oh gut, das hilft mir auch für mein kommendes Selfmade Script weiter.
    Schade das es hier kein "Thx Button" gibt, also sag ich mal so danke :P


    Jetzt weis ich auch, wie ich effizent Player Updates mache ;)