Announcement

Collapse
No announcement yet.

DataAdapter.Fill füllt Arbeitsspeicher

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

  • DataAdapter.Fill füllt Arbeitsspeicher

    Hallo,

    ich fülle über mehrere Dataadapter einen Dataset.
    Diesen Dataset muss ich zyklisch aktualisieren. Somit rufe ich Dataadapter.fill erneut auf.
    Die Daten werden aus der Datenbank in den Dataset geschrieben. Funktioniert

    Jetzt zu meinem Problem:

    Bei jeder Aktualisierung werden ca. 300 kB Arbeitsspeicher mehr benötigt. Wenn das Programm länger läuft wird der Speicher ausgelagert und bremst die anderen Programme aus.

    Ich habe folgende Varianten ausprobiert, damit der Speicher freigegeben wird.
    Dataset.clear
    Dataset.Dispose
    Dataadapter.Dispose


    Kennt jemand eine Möglichkeit, damit der Arbeitspeicher freigegeben wird?

    Gruß und Dank

    Haldo

  • #2
    Hallo,

    um welchen ADO.NET-Datenbank-Provider (Sql, OleDb, Odbc etc.) handelt es sich?

    Comment


    • #3
      Hallo,

      ich greife per OleDb auf Paradox- Tabellen zu.
      Per ODBC habe ich es auch schon versucht.

      Gruß

      Haldo

      Comment


      • #4
        Hallo,

        anbei habe ich den Code meiner Testanwendung:
        Imports System.Data.OleDB
        Public Class Form1

        Private aDS As New DataSet
        Private AufkopfTable As DataTable
        Private KundenTable As DataTable
        Private Rel As DataRelation
        Private BDEConStr As String
        Private BDECon As New OleDbConnection
        Private aCmd As New OleDbCommand
        Private aCmd1 As New OleDbCommand
        Private aAdp As New OleDbDataAdapter
        Private aAdp1 As New OleDbDataAdapter

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        BDEConStr = "Provider=Microsoft.Jet.OleDb.4.0;Data Source='D:\Daten';Extended Properties=Paradox 5.x;Mode=Read;"
        BDECon.ConnectionString = BDEConStr
        aCmd.CommandText = "SELECT Auftrag, Beschreibung1, Kunde FROM Aufkopf"
        aCmd.Connection = BDECon
        aAdp.SelectCommand = aCmd
        aCmd1.CommandText = "SELECT Kunde, Kundenname FROM Kunden"
        aCmd1.Connection = BDECon
        aAdp1.SelectCommand = aCmd1
        aAdp.Fill(aDS, "Aufkopf")
        AufkopfTable = aDS.Tables("Aufkopf")
        aAdp1.Fill(aDS, "Kunden")
        KundenTable = aDS.Tables("Kunden")
        Rel = New DataRelation("AufkopfKunden", KundenTable.Columns("Kunde"), AufkopfTable.Columns("Kunde"))
        aDS.Relations.Add(Rel)
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        aDS.Relations.Clear()
        aDS.Clear()
        aDS.EnforceConstraints = False
        aAdp.Fill(aDS, "Aufkopf")
        aAdp1.Fill(aDS, "Kunden")
        Rel = New DataRelation("AufkopfKunden", KundenTable.Columns("Kunde"), AufkopfTable.Columns("Kunde"))
        aDS.Relations.Add(Rel)
        MessageBox.Show("Aufkopf Datensätze: " & AufkopfTable.Rows.Count & vbNewLine _
        & "Kunden Datensätze: " & KundenTable.Rows.Count & vbNewLine _
        & "Dataset Tabellenanzahl: " & aDS.Tables.Count)
        End Sub
        End Class
        Mit jedem Button1_Click wird der Speicher gefüllt, obwohl keine Daten dazu gekommen sind.

        Gruß

        Haldo

        Comment


        • #5
          Kurze Zwischenfrage: Muss es denn noch Paradox sein? Unter .NET ist das mehr als eine Krücke ein schon vor 5 Jahren veraltetes System noch weiter zu verwenden.

          Comment


          • #6
            Ich kann jetzt auch nur tippen:
            So wie es scheint, wird bei deiner Variante immer der gleiche Command verwendet. Mir ist in diesem Zusammenhang aufgefallen, dass - wenn immer das gleiche Command-Objekt verwendet wird - Ressourcen daraus nicht korrekt freigegeben werden. Eventuell liegt es daran.
            .NET GUI - DIE Community für GUI-Entwickler

            Living.NET - Blog :: Live Blog :: .NET Casts

            Hol' dir jetzt dein kostenloses .NET BlogBook.

            Comment


            • #7
              Hallo,

              @Bernhard Geyer

              Leider kann ich mir die Datenbank in diesem Projekt nicht aussuchen, da mir die Daten aus einem anderen System zur Verfügung gestellt werden.

              @Norbert Eder

              Auch mit einem neuen Command-Objekt läuft der Speicher voll.

              Gruß

              Haldo

              Comment


              • #8
                Hallo,

                ..ich greife per OleDb auf Paradox- Tabellen zu...
                das Speicherleck hat nichts mit .NET zu tun, denn der Gargabe Collector kann sich nur um managed code kümmern. Im Fall des Zugriffs auf die Paradox-Datenbank ist jedoch jede Menge unmanged code im Spiel ;-)

                Um zu prüfen, welcher Teil für das Speicherleck zuständig ist, würde ich die folgenden Experimente ausführen:

                Testprogramm 1: In einer Schleife wird ständig die Datenbankverbindung (OleDbConnection) geöffnet und geschlossen, ohne eine Anweisung dazwischen auszuführen. Wenn sich das in der angehängte Abbildung dargestellte Verhalten ergibt, ist der Schuldige gefunden.

                Testprogramm 2: Das eigenge Programm so ändern, dass die OleDbConnection-Instanz während der kompletten Programmlaufzeit geöffnet bleibt.
                Attached Files

                Comment


                • #9
                  Hallo,

                  Bei Testprogramm 1 läuft mir der Speicher voll.

                  Bei Testprogramm 2 läuft mir der Speicher nicht mehr ganz so schnell voll.

                  Gruß

                  Haldo

                  Comment


                  • #10
                    Hallo,

                    Bei Testprogramm 1 läuft mir der Speicher voll
                    dann hat das nichts mit .NET zu tun, sondern mit der Treiberanbindung an die Paradox-Datenbank (Win32). In diesem Fall muss das Programm die Datenbankverbindung permanent offen halten.

                    Comment


                    • #11
                      Hallo,

                      wenn ich die Connection offen lasse, sind es ca. 10 Kb pro Aktualisierung.

                      Ich denke mit diesen Werten kann man leben.

                      Besten Dank für die Hilfe.

                      Gruß

                      Haldo

                      Comment

                      Working...
                      X