none
Batch-Abfragen auf eine Access-Datenbank

    Frage

  • Hallo zusammen,

    in einer Anwendung von mir habe ich eine com.DLL erstellt welche alle Commands für die Datenbank beinhaltet. Aus der Hauptanwendung selber lade ich dann die entsprechenden Commands.

    Jeder Command schaut vom Schema so aus

        Public Function SELECT_Typ(ByVal TypID As Integer) As DataTable
            SELECT_Typ= New DataTable
            Try
                Using con As New OleDb.OleDbConnection(mConString)
                    Dim cmd As New OleDb.OleDbCommand("SELECT * FROM tbTyp WHERE TypID = @TypID", con)
                    cmd.Parameters.Add("@TypID", OleDb.OleDbType.Integer).Value = TypID
                    Dim ta As New OleDb.OleDbDataAdapter(cmd)
                    ta.Fill(SELECT_Typ)
                End Using
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Critical, "SELECT_Typ")
            End Try
        End Function

    Das Problem was sich nun langsam bei mir abbildet ist, dass der TableAdapter nach jedem Fill das Connection.Close aufruft und dies dauert ca. 250ms. Wenn man jetzt natürlich nur eine Tabelle so abruft, dann ist es für den Benutzer recht schnell. Wenn man allerdings aus mehreren Tabellen hintereinander lesen möchte, dann kann es natürlich passieren, dass man 2 Sek warten muss und das empfinde ich als sehr störend.

    Daher meine Frage ... welche Möglichkeit steht mir zur Verfügung um mehrere Abfragen hintereinander zu starten ohne mit soeinem hohen Performanceeinbruch leben zu müssen?

    Beste Grüße

    Samstag, 13. Juli 2013 08:54

Alle Antworten

  • Hallo,

    deine "hohen Performanceeinbruch" hängt nicht von deine Batch selbst, sondern davon ab, was für die Datenbankabfragen werden ausgeführt.
    Man kann einen Batch-Datei erstellen und der dann z.B. mit Windows-Aufgabenplannung ständig ausführen lassen.

    Profi.

    Samstag, 13. Juli 2013 12:49
  • Hallo und danke für deine Antwort.

    Das Vorgehen erschließt sich mich nicht so ganz!

    Ich habe eine Anwendung als Frontend und als Backend eine Access-Datenbank. Wenn ich jetzt unterschiedliche Formen lade, dann greife ich auf unterschiedliche Tabellen zu. Da ich im Moment jeder Abfrage für sich ausführe, sorgt der TableAdapter dafür, dass bei jeder Abfrage die Verbindung auf und wieder abgebaut wird. Dies kostet viel Zeit wenn man 5 solcher Abfragen startet.

    Was soll ich da nun mit einem Windows Aufgabenplaner machen?

    Samstag, 13. Juli 2013 12:55
  • Hi,

    ich denke, er hat sich von deinem Titel "Batch-Abfragen" beirren lassen. (Allerdings weiß ich auch nicht, was an deiner Sache nun ein Batch sein soll).

    Wenn Du nicht jedes mal eine Verbindung öffnen und schließen willst, solltest Du vor dem Aufruf der einzelnen Methoden eine Connection erstellen, diese offen lassen, deine Methoden aufrufen und denen das Connectionobjekt übergeben und nach Abschluss der Arbeiten die Verbindung wieder schließen.

    Sprich, Du erzeugst in jeder Methode einen neuen Übergabeparameter ByVal con As OleDbConnection und lässt das Using Statement weg.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 13. Juli 2013 13:24
    Moderator
  • Hallo Stefan,

    ein Batch ist doch eine Menge von Aufgaben die sequenziell abgearbeitet wird oder nicht?

    Egal! Ich werde es mal versuchen mit der Übergabe des ConnectionObjekts.

    Danke!

    Samstag, 13. Juli 2013 13:32
  • Hi,
    der TableAdapter impliziert ein Connection.Open, wenn vorher die Verbindung geschlossen war und stellt zum Ende den ursprünglichen Verbindungszustand wieder her. In Deinem Fall bedeutet das, dass bei jedem Aufruf die Verbindung geöffnet und wieder geschlossen wird. Wenn der Datenbankserver das standardmäßig aktivierte ConnectionPooling nutzt, dann gibt es keine Performanceprobleme. Deine Nutzung von OleDb lässt aber vermuten, dass Du in einer Einplatzanwendung eine Datei (z.B. Access-Datei) als Datenablage nutzt. Da wird bei jedem Öffnen und Schließen eine umfangreiche Arbeit geleistet, was Zeit kostet. In diesem Fall solltest Du zu Programmbeginn die Verbindung öffnen und dann zu Programmende wieder schließen. Das kann man erreichen, indem nur eine Instanz der Datenzugriffsklasse genutzt wird, die im Konstruktor die Datenbankverbindung öffnen und im Dispose wider schließt.

    --
    Peter

    Samstag, 13. Juli 2013 13:32
  • Hallo Peter,

    danke für deine Antwort. Ich arbeite mit einer Access-Datei welche später auf einem Netzlaufwerk liegen und auf welche von mehreren Arbeitsplätzen drauf zugegriffen werden soll.

    Wenn ich eine Verbindung dauerhaft geöffnet habe, habe ich bedenken, dass es wie bei uns im Betrieb zwischenzeitlich zu den Meldungen kommt "Zugriff durch anderen User gesperrt".

    Daher die Überlegung die Verbindung auch nach jedem Zugriff zu schließen.

    Samstag, 13. Juli 2013 14:12
  • Hi,
    eine Access-Datei ist nur für den Einplatzbetrieb konzipiert. Es geht zwar praktisch auch der Dateizugriff von mehreren Nutzern. Du wirst damit aber keine Freude haben. Das Ergebnis kann schnell eine korrupte Datei sein. Auch Dein ständiges Öffnen und Schließen der Verbindung bewirkt ein intensives Ändern der dazugehörenden ldb. Ich kann mit nur einem kleinen Programm mit mehreren threads zeigen, wie schnell die Zugriffe die MdB zerstören.

    Heute gibt es die kostenlose Express Edition des SQL Servers 2012 (auch 2005 und 2008 kostenlos möglich). Damit wären dann 10GB Datenbankgröße möglich. Auch weitere Einschränkungen auf Cores und Nutzer sind nicht vergleichbar mit den Problemen, die Du mit mdb-Dateien bei mehrfachen Zugriffen bekommst.

    --
    Peter

    Samstag, 13. Juli 2013 16:02
  • Ich bin mir dessen bewusst! Allerdings möchte ich bei meiner Anwendung nicht immer einen SQL-Server installieren.

    Bei meiner Anwendung ist es unwarscheinlich, dass zwei Benutzer gleichzeitig ein und denselben Datensatz bearbeiten.

    Eine alternative Lösung habe ich bisher noch nicht gefunden ... außer SQL-Server :-(

    Wäre beim SQL-Server auch eine dauerhafte Verbindung sinnvoll?
    • Bearbeitet Desert-Fox Samstag, 13. Juli 2013 16:13 Nachtrag
    Samstag, 13. Juli 2013 16:11
  • Hi,
    wenn die mdb-Datei sowieso nur im Einplatzbetrieb genutzt wird, dann bekommst Du auch keine Probleme beim parallelen Zugriff. Sobald die Datei aber gleichzeitig durch mehrere Anwender genutzt wird - nicht ein Datensatz, sondern die Datei -, dann kannst Du recht schnell Probleme bekommen. Mir scheint, dass Du Dir dessen nicht bewusst bist. Eine mdb-Datei hat keine serverseitige Komponente, die den parallelen Zugriff organisiert. Das mach die Jet oder Accdb in jedem Client selbständig. Netzunsicherheiten erzeugen ganz schnell korrupte mdb-Dateien, genau so wie häufige Nutzung der ldb wegen Öffnen und Schließen der Verbindung.

    --
    Peter

    Samstag, 13. Juli 2013 16:17