Blackodem Geschrieben 25. Januar 2013 Geschrieben 25. Januar 2013 Hallo Gemeinde, ich schreibe derzeit eine Konsolenanwendung, die Daten von einer Datenbank zur anderen karrt. Das passiert in einer Schleife, leider wird der Arbeitsspeicherverbrauch immer höher, also gehe ich davon das die Objekte aus den älteren Durchgängen noch irgendwie gespeichert bleiben. static void Main(string[] args) { Console.SetWindowSize(Console.WindowWidth, Console.WindowHeight); Konfiguration lKonfig = new Konfiguration(); lKonfig.ShowDialog(); int liTimeout = 2000; if (lKonfig.DialogResult == System.Windows.Forms.DialogResult.OK) { liTimeout = lKonfig.Timeout * 1000; while (Run) { try { Sql lSql = new Sql(lKonfig.ConnectionStringFirebird, lKonfig.ConnectionStringSybase); Log.Info("Transfer wird gestartet", ConsoleColor.White); bool lbAenderung = lSql.AverpZuIcline(); if (lbAenderung) Log.Info("avERP zu ICLine Transfer erfolgreich beendet. Details zu den Änderungen entnehmen Sie bitte dem Log", ConsoleColor.Green); else Log.Info("avERP zu ICLine Transfer erfolgreich beendet. Es gab keine Änderungen", ConsoleColor.Green); lbAenderung = lSql.IclineZuAverp(); } catch (Exception e) { Log.Fehler(e.Message.ToString()); } Thread.Sleep(liTimeout); } } } Ich bin extra dazu übergegangen, das SQL Objekt jeden Durchlauf neu zu erstellen, aber das hat leider auch nichts gebracht. Auch GC.Collect() am Ende der Schleife hilft nicht. Das Programm läuft so lange bis der Arbeitsspeicher voll ist und schießt sich dann mit einer OutOfMemoryException ab. Hat jemand einen Tipp was man ändern sollte? Wenn ihr noch weitere Infos etc braucht, stell ich euch die gerne zur Verfügung Zitieren
lbm1305AtWork Geschrieben 25. Januar 2013 Geschrieben 25. Januar 2013 (bearbeitet) Sehr ungewöhnlich die Mischung zwischen Console und WinForms, aber egal. Zuerst würde ich das Herstellen der Connection(s) aus der Scheife herausnehmen. Dann noch eine Frage: Was soll "Thread.Sleep()" für eine Funktion haben? EDIT: Achso, die Klasse SQL macht hier wohl alles? Verbindung aufbauen, Command absetzen und Verbinding trennen? EDIT2: Ist es möglich, die Insert Commands zur Zieldatenbank im Programm zu erstellen und alle auf einmal ausführen zu lassen? Bearbeitet 25. Januar 2013 von lbm1305AtWork Zitieren
ronaldus Geschrieben 25. Januar 2013 Geschrieben 25. Januar 2013 Hi, Beim Kopieren oder Einfügen großer Datenmangen nutze ich gern BulkInsert....Den Code der SQL-Klasse solltest du zur Analyse hier zugänglich machen, sonst kann man nicht viel erkennen... Gruß Ronaldus Zitieren
lbm1305AtWork Geschrieben 25. Januar 2013 Geschrieben 25. Januar 2013 @Ronaldus Wenn ich von dem Code ausgehe, wird hier von Firebird in eine Sybase DB geschrieben. Die Frage ist, ob das unterstützt wird. Aber ich gebe Dir Recht, dass man vom dem SQL-Code mehr sehen muss. Zitieren
ronaldus Geschrieben 25. Januar 2013 Geschrieben 25. Januar 2013 @lbm1305 Hast recht, wird von Sybase nicht unterstützt....Man könnte dort anscheinend eine File über BCP schnell in die DB laden... Gruß Ronaldus Zitieren
uenetz Geschrieben 25. Januar 2013 Geschrieben 25. Januar 2013 Servus ! 1. Methoden des Garbage-Collector kannst Du ja auch nur nutzen, wenn Du die Objekte mit gcnew instanziierst. 2. Auf jeden Fall mal Sql lSql = new Sql(lKonfig.ConnectionStringFirebird, lKonfig.ConnectionStringSybase); aus der Schleifer herausnehmen. 3. Was meint denn der Debugger ? 4. Wo ist die Variable Run deklariert + initialisiert? 5. ... Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.