Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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 von lbm1305AtWork

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

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. ...

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.