MySQL UDF - mit libmySQL.dll (kein ODBC)

  • Hi...

    Bin bei mir in der Firma eine Software am entwickeln, die aus mehreren MSSQL DBs daten ausließt und diese in eine MySQL DB schreibt... Jetzt habe ich das Problem das die Software 24h läuft und die Daten alle 5 min Aufbereitet...leider gibt es dabei ein Problem mit dem Arbeitsspeicher... denn nach ca. 1 Tag ist der auf satte 2 GB nur für für den Prozess meiner Software angewachsen... Woran kann das liegen? kann mir das echt nicht erklären... nach den Arrays habe ich schon geguckt das die auch alle wieder geleert werden... Ich habe leicht die vermutung das bei einem MYSQL Query immer der Speicher steigt? Ich habe mir mal versucht das ganze mit ProcessGetStats() rauszufiltern. Nur leider wird es extrem unübersichtlich durch sehr viele While... ?(

    Ich kann auch leider den ganzen Code nicht Posten, da er eh nur mit den DBs arbeitet... Kann aber mal Teile reinstellen...
    Also wenn jemand weiß wo ich am besten mal nachgucke ^^

    Hier ist mal nen kleiner Auszug aus meiner Preformance Log

    Im Prinzip ist Schritt 1 - 7 der Startvorgang und Schritt 9 - 11 wiederholt sich alle 5 min .... und jedes mal kommen die ca. 18 MB im Arbeitsspeicher dazu...
    das verstehe ich nicht... mal gucken ich kann wenn einer sie Braucht die _complete_OPT_refresh() Funktion + Unterfunktionen mal Posten...

    Danke schonmal

    MFG chris :D

  • Also entweder könnte das an ungeschlossenen Ergebnissätzen der MySQL.au3 liegen oder eventuell auch an den MSSQL-Objekten. Ohne den Quellcode ist das aber ein reines Ratespiel.

  • Du hast vergessen, die Ergebnisemenge nach Benutzung wieder frei zu geben:

    [autoit]

    _MySQL_Real_Query($MysqlConn, $MySQL)
    $res = _MySQL_Store_Result($MysqlConn)
    $array = _MySQL_Fetch_Result_StringArray($res)
    _MySQL_Free_Result($res) ; <==== DAS FEHLT

    [/autoit]


    Außerdem musst du am Ende die Verbindung beenden (am besten in AutoItExitFunc):
    _MySQL_Close($MysqlConn)
    und die MySQL-Library beenden:
    _MySQL_EndLibrary()

  • super danke das werde ich mal testen...

    Wenn ich nur nen Query habe und kein StoreResult muss ich dann auch leeren?

    EDIT: DANKE das wars ..... Klasse echt !!!

    Jetzt sind nach dem 1 mal Update keine veränderungen am Arbeitsspeicher mehr zu sehen....

    MFG chris :D

  • Schöne Sache, aber zwei Fragen:

    • Im Startpost steht was von einer x64 dll, ich kann diese aber im package nicht finden... wie funktioniert das mit 64bit systemen ?
    • Ich will ein einzelnes Feld zurückgeben lassen. Das mache ich z.bsp. per query "SELECT rly FROM banlg WHERE hdwid = '998685592392330'". WIe benutze ich nun Fetch_Field, um das feld wiederzugeben ? Bisher gibt er mir nur Murks zurück... Etwaige Parameter fehlen mir ebenfalls...
    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

    3 Mal editiert, zuletzt von Dankeschön (11. Juni 2010 um 20:16) aus folgendem Grund: komplettedit

  • Schöne Sache, aber zwei Fragen:
    Im Startpost steht was von einer x64 dll, ich kann diese aber im package nicht finden... wie funktioniert das mit 64bit systemen ?

    Irgendwie hat der Upload nicht geklappt. Jetz sollte es stimmen. Vielen Dank für die Meldung ;)

    Ich will ein einzelnes Feld zurückgeben lassen. Das mache ich z.bsp. per query "SELECT rly FROM banlg WHERE hdwid = '998685592392330'". WIe benutze ich nun Fetch_Field, um das feld wiederzugeben ? Bisher gibt er mir nur Murks zurück... Etwaige Parameter fehlen mir ebenfalls...


    Fetch_Field gibt nur die Informationen zu einem Feld zurück. Du musst schon fetch_row verwenden oder fetch_row_stringarray.
    Was für Parameter fehlen dir denn? Ich habe die Funktionen 1:1 aus der DLL genommen und ein paar zusäzliche erstellt.

    Einmal editiert, zuletzt von progandy (18. Juni 2010 um 09:04)

  • Guten Tag,

    Ich habe mit MySQL einen kleinen Chat gebastelt, mit dem ich mit meinen freunden auf der Arbeit kommunizieren kann.
    nun haben jedoch einige probleme beim Verbinden.
    Meine 1. Vermutung liegt darin, dass der MySQL-Port bei der Firewall gesperrt ist, denn ich habe so ein Microsoft Firewall Client, wenn ich den abschalte funktionierts bei mir auch nicht, ist es irgendwie möglich der Firewall etwas mitzugeben, dass ich da durch komme?
    Meine 2. Vermutung liegt darin, dass ich die Proxy-Einstellungen beim Verbinden nicht mitgebe, ist es möglich, diese irgendwie mitzugeben?


    freundliche Grüsse
    V3xX

    Einmal editiert, zuletzt von V3xX (16. August 2010 um 15:17)

  • Hallo,

    ich weiß nicht ob hier überhaupt noch jemand Support zu dem MySQL-Script anbietet aber ich frage einfach trotzdem mal nach!

    und zwar hab ich ein sehr seltsames Problem mit dem Script.
    Ich kann mich auf meinen MySQL-Server (gemieteter Root-Server) verbinden und auch Werte in die Datenbank einfügen.
    Mache ich allerdings eine "SELECT"-Abfrage, so bekommt AutoIT keine Antwort vom Server (also kein ergebnis der Abfrage)
    Dass Programm läuft allerdings auf meinem Home-PC mit lokalen datenbank. Da die Software allerdings für mehrere Leute gedacht ist, benötige ich einen Zugang übers Internet.

    kann mir wer helfen an was es evtl liegne könnte? (vllt ein Firewall-Problem?)

    Danke und Gruß
    4Soldier93

  • Geht leider auch nicht!<br><br>Folgende Fehlermeldung bei außwahl einer tabelle:<br><br>Error: `F4R`.`Laender`: table data is not editable because there is no primary key defined for the table<br><br>Was ist hier das Problem??<br><br>habe beim Root-Server eig. nichts anders gemacht als lokal auf meinem PC (sind die gleichen SQL-Befehle)?? (Außer dass ich Windows und der Server linux hat)<br><br>## EDIT:<br>na Super. Bei der MySQL-Version benötigt man, warum auch immer, einen Primary key<img src="wcf/images/smilies/squint.png" wcf_src="wcf/images/smilies/squint.png" alt="^^"><br><br>Jetzt läuft alles <img src="http://www.autoit.de/wcf/images/smilies/smile.png" wcf_src="http://www.autoit.de/wcf/images/smilies/smile.png" alt=":)"><br><br>## EDIT2:<br>Naja, geht mit AutoIt doch nicht :/<br>

    3 Mal editiert, zuletzt von 4Soldier93 (23. Mai 2011 um 18:58)

  • JEDE Tabelle sollte einen Primärschlüssel haben, vor allem bei Löschoperationen und beim Bearbeiten ist das von Vorteil, da der Eintrag nur 1x gesucht werden muss: Eintrag suchen, Eintrag bearbeiten -> Eintrag anhand von ID ohne suchen speichern ;)

  • Sry, das mein letzter Edit die Formatierung verhackt hat. Keine Ahnung was mein Browser da schon wieder gemacht hat -.-

    Auf jedenfall tut es doch noch nicht. Mein Script erhält immer noch keine Ergebnise :(

    Edit1:

    Bin noch Datenbanken anfänger^^
    Entschuldige meine Unwissenheit :)

    Edit2:

    Was ich vergessen habe zu erwähnen!
    Workbench kann nun Ergbnisse auslesen und zeigt mir alle Werte an. Aber auch NUR Workbench. AutoIt leider nicht

    Einmal editiert, zuletzt von 4Soldier93 (23. Mai 2011 um 19:08)

  • Jetzt hab ich den Fehler gefunden :D

    Au man, was für ein gesuche :P

    Bei der MySQL-Datenbank auf Linux wird Groß- Kleinschreibung beachtet.

    danke für die Hilfe Progandy :)

  • Hallo,

    die DLL-Variante ist 'ne prima Alternative zur ODBC-Variante.
    Jedoch bringt mir

    [autoit]

    _MySQL_Real_Connect()

    [/autoit]

    immer eine MsgBox mit dem Titel "Error" und dem Inhalt "0".
    In der Funktion aus der MySQL.au3 wird dieser Wert offenbar durch

    [autoit]

    DLLCall()

    [/autoit]

    generiert.

    Habt ihr eine Idee, woran das liegen könnte ?
    Beim Provider habe ich den externen Zugriff auf die MySQL-Datenbank zugelassen.


    Viele Grüße, und DANKE im Vorraus !!!
    sgfan

  • Du musst schon den entsprechenden Codeausschnitt einstellen, so hab ich keine Anhaltspunkte.

  • Hallo progandy,

    hier der Quelltext:

    [autoit]


    ;MySQL-Verbindung
    Local $db_connection_data[5] ;Array für MySQL-Verbindungsdaten
    $db_connection_data[0] = "<MySQL-Server>" ;MySQL-Server
    $db_connection_data[1] = "<MySQL-Benutzer>" ;MySQL-User
    $db_connection_data[2] = "<MySQL-Passwort>" ;MySQL-Passwort
    $db_connection_data[3] = "<MySQL-Datenbank>" ;MySQL-Datenbank
    $db_connection_data[4] = "3306" ;Datenbank-Port

    [/autoit][autoit][/autoit][autoit]

    Global $mysql = _MySQL_InitLibrary() ;MySQL starten
    Global $db_connection = _MySQL_Init() ;MySQL initialisieren
    $connected = _MySQL_Real_Connect($db_connection, $db_connection_data[0], $db_connection_data[1], $db_connection_data[2], $db_connection_data[3], $db_connection_data[4]) ;MySQL-Verbindung herstellen

    If $connected = 0 Then ;prüfen, ob Verbindung erfolgreich hergestellt wurde
    $errno = _MySQL_errno($db_connection)
    MsgBox(0,"Error", $errno & @LF & _MySQL_error($db_connection)) ;Ausgabe einer Fehlermeldung
    If $errno = $CR_UNKNOWN_HOST Then
    MsgBox(0,"Error", "$CR_UNKNOWN_HOST" & @LF & $CR_UNKNOWN_HOST) ;Ausgabe einer Fehlermeldung
    _exit() ;Programm beenden
    Endif

    [/autoit]


    Viele Grüße
    sgfan

  • Verwendest du AutoIt im 64bit-Modus? Füge mal noch eine @error-Abfrage nach jedem _MySQL-Aufruf ein. Wo kommt der erste Fehler?

    Und eventuell reicht dir auch EzMysql, das hat eine etwas vereinfachte API ;)