Announcement

Collapse
No announcement yet.

Mehrere MYSQL-Anfragen 'gleichzeitig' mit mysql_query bearbeiten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mehrere MYSQL-Anfragen 'gleichzeitig' mit mysql_query bearbeiten

    Sehr geehrte User,

    wie der Titel schon verlauten lässt,
    möchte ich mehrere mysql-Anfragen 'gleichzeitig' bearbeiten.

    Im speziellen Anwendungsfall erstellen wir stets ca. 100 bis 200 Tabellen.
    Wenn jede Tabelle einzeln erstellt und anschließend befüllt wird
    sind das bis zu 400 mysql_query() Aufrufe!
    Dies dauert bis zu mehreren Minuten. (xampp)

    Als schneller und einfacher erweist es sich, diese bis zu 400 Anweisungen per Semikolon getrennt an mysql_query() zu übergeben! Damit habe ich auf einmal nur noch einen Aufruf, an Stelle von 400'en!

    ABER: Sollte zwischendurch ein MYSQL-Befehl schief gehen,
    werden die restlichen auch nicht mehr ausgeführt.
    Da mysql_query() stets nur den ersten Anfragestatus zurückgibt, kann ich mit mysql_errno() nicht testen, ob zwischendurch irgendwann eine Anfrage fehl schlug.

    Mit mysql_next_result() kann ich zwar jeden einzelnen Aufruf in einer Schleife durch gehen, und jeden auf mysql_errno() testen, jedoch habe ich damit schon wieder viel zu viele Aufrufe und wiederum keine Zeitersparnis!!

    Meine Überlegung war nun, einfach nachzuschauen, ob die allerletzte Tabelle angelegt wurde.
    Im Normalfall, wenn kein Fehler auftrat, ist dem so!
    Sollte die Tabelle nicht vorhanden sein, könnte ich immer noch in einer Schleife per mysql_next_result() und mysql_errno() auf Fehler testen.
    Für den Fall, dass ein Fehler auftrat, würde ich die Zeitkosten in Kauf nehmen,
    da Fehler ja nicht auf der Tagesordnung stehen.

    Doch, kann ich nach einem misslungenen mysql_query() irgendwie kein weiteres aufrufen, ich bekomme dann ständig die Fehlermeldung:
    "Commands out of sync; you can't run this command now"
    Und auch wenn ich testen könnte, ob die Tabelle angelegt wurde oder nicht,
    wie könnte ich dann noch auf die Resultate von vorher zugreifen, um den Fehler-Report finden und ausgeben zu können?

    Fragen:
    - Wie könnte ich nach dem Query Aufruf am besten prüfen,
    ob die Aufrufe fehl schlugen?
    - Habt ihr eine Alternative Idee?

    Mit freundlichen Grüßen
    Predat0hr

    Ps.: Ich programmiere derzeit unter Visual Studio 2008 in C++/CLI !

  • #2
    Hi,

    lass doch mehrere Threads gleichzeitig laufen. Du baust dir ein kleines Kontrollprogramm, welches per Konfiguration mitgeteilt bekommt wie viele Threads immer gleichzeitig laufen sollen und sobald ein Thread beendet ist wird ein neuer gestartet.
    Bricht ein Thread ab, kannst Du die Exception fangen und siehst sofort bei welcher Tabelle der Fehler aufgetreten ist.

    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      Verwende prepared Statements. Das beschleunigt die Sache auch um einiges.

      Comment


      • #4
        Lieben Dank für eure Antworten,

        leider bin ich mit MYSQL jetzt noch nicht so bewandert, dass ich eure Gedankengänge gleich nachvollziehen kann... !!
        Unter "prepared Statements" kann ich mir schon mal gar nichts vorstellen.
        Und das mit mehreren Threads gleichzeitig, wie würde das in der Praxis dann z.B. aussehen?

        Könnt ihr euch noch ein wenig ausformulieren?
        Oder auf vorhandene Tutorials, bzw. Hilfen hinweisen?

        Danke!!

        Und noch mal der Hinweis:
        C++ Code als Beispiel wäre sehr hilfreich!!!!
        Zuletzt editiert von Predat0hr; 20.01.2010, 23:53.

        Comment


        • #5
          Da ich kein PHP mache, musst du hier http://tinyurl.com/ylzmyla bemühen

          Comment


          • #6
            Originally posted by Bernhard Geyer View Post
            Da ich kein PHP mache

            Originally posted by Predat0hr View Post
            Ps.: Ich programmiere derzeit unter Visual Studio 2008 in C++/CLI !
            MfG Predat0hr

            Ps.: ( btw. ich liebe solche Antworten, wozu gibt's ein Forum, wenn ich am Ende auf google verwiesen werde ... ??????!!!! )

            PPs.: So eben kommt mir eine Idee. Ich werde eine 2. MYSQL Instanz erstellen, auf dieser prüfen, ob die letzte Tabelle vorhanden ist, wenn nicht, kann ich in der 1. Instanz die lange Fehlersuche starten!
            Das sollte gehen, und im fehlerfreien Fall sehr zeitsparend sein!
            Dann sind es überschaubar viele MYSQL-Anfragen!
            Zuletzt editiert von Predat0hr; 21.01.2010, 02:28.

            Comment


            • #7
              Irgendwie bin ich bei MySQL und dem Hinweis auf xampp gleich bei PHP gelandet.

              Aber wenn es VS mit CLI/NET ist dann ist doch die MSDN die Einstiegsquelle Nr. 1 und hier ist die ADO.NET die zu verwendente Quelle. Du mußt dir nur einen passenden ADO.NET Provider für MySQL herunterladen + installieren. Beispielcode ist z.B. hier zu finden.

              Originally posted by Predat0hr View Post
              Ps.: ( btw. ich liebe solche Antworten, wozu gibt's ein Forum, wenn ich am Ende auf google verwiesen werde ... ??????!!!! )
              Da ich auf dem PHP-Dampfer war habe ich eine Google-Abfrage gesucht die Beispiele für PHP liefert.

              Comment


              • #8
                Vielen Dank für das korrekte Einkategorisieren

                Eine tiefgründige Antwort auf eine belastende Frage würde eigentlich all meine derzeitige Verwirrung vaporisieren. Und zwar:

                Wenn ich beispielsweise folgende Anfrage erstelle:
                (Sieht komplizierter aus, als sie ist!
                Ich erstelle einfach eine Struktur, und dann in einer Schleife eine Anfrage um mehrere gleichartige Tabelle zu erstellen.)

                // Struktur zusammenstellen
                // Anfang
                String^ Structure = "(`ID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,`0` TEXT,";
                for ( int n = 1; n < columns - 2; n++ )
                {
                // Mittelteil
                Structure += "`" + Convert::ToString( n ) + "` TEXT,";
                }
                // Ende
                Structure += "`" + Convert::ToString( columns - 1 ) + "` TEXT, PRIMARY KEY ( `ID` ))";

                // Anfrage zusammenstellen
                for ( int n = 0; n < tables; n++ )
                {
                Query += "CREATE TABLE IF NOT EXISTS `" + database + "`.`" + Table + Convert::ToString( n ) + "` " + Structure + " ENGINE = MYISAM;";
                }

                // Anfrage abschicken
                // String^ Query vorher marshal'n in const char*!!
                mysql_query( &mysql, ( const char* )( Runtime::InteropServices::Marshal::StringToHGlobal Ansi( Query ) ).ToPointer() );

                // Anfrage auf Fehler testen
                if ( mysql_errno( &mysql );
                {
                Report = gcnew String( mysql_error( &mysql ) );
                }


                Die Frage:
                Für den Fall, dass der Status, welchen mysql_query() für die erste Anfrage zurückgibt,
                fehlerfrei ist, kann dann überhaupt eine der folgenden Anfragen schief gegangen sein,
                wenn man ausschließen kann, dass ein Syntax Fehler aufgetreten ist?

                Kann man daraus schließen, dass die erste Anfrage erfolgreich bearbeitet wurde,
                dass auch die anderen Anfragen erfolgreich bearbeitet worden sind?

                Welche Fehler könnten überhaupt auftreten, wenn ich die Bedingung stelle, dass die Syntax in String^ Query; korrekt ist?

                Damit ich eine weitere mysql_query() an &mysql stellen darf, ohne &mysql zu schließen und neu initialisieren zu müssen, bin ich gezwungen, vorher folgende Überprüfung durchzuführen:

                while ( mysql_next_result( &mysql ) >= 0 )
                {
                if ( mysql_errno( &mysql ) )
                {
                Report = gcnew String( mysql_error( &mysql ) );
                break;
                }
                }

                Ginge das auch einfacher, bzw. schneller?
                (ein einfaches nein, ist auch akzeptabel)

                Comment

                Working...
                X