Announcement

Collapse
No announcement yet.

Lange Abfrage abbrechen

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

  • Lange Abfrage abbrechen

    Hallo!<p>
    Schon oft hab ich mir gewünscht, eine lange Abfrage einfach abzubrechen können. Wie könnte man sowas realisieren? Die einzige Möglichkeit die ich mir derzeit vorstellen kann, ist die Abfrage in einen eigenen Thread laufen zu lassen, und diesen dann bei Bedarf mit <b>TerminateThread</b> brutal abzuwürgen..... eine andere Frage ist, ob das Programm dann noch stabil rennt. Vielleicht gibts da ja noch eine andere Möglichkeit...<p>
    Da die Thread-Programmierung immer mit einer Menge Arbeit verbunden ist, wäre ich für Erfahrungsberichte sehr dankbar.<p>
    Mir geht es dabei hauptsächlich um die Bde mit Oracle8, aber auch für andere Datenbankenengines (Ado, Ibx) und Datenbanken (vorallem Access und Interbase) würde es mich interessieren.<p>
    Gruß,<br>
    Bernhard

  • #2
    vielleicht mit einer callback-funktion...
    weiß aber nicht genau!!

    mfg

    marku
    Herzliche Grüße

    Markus Lemcke
    barrierefreies Webdesign

    Comment


    • #3
      @Bernhard

      Untersuch Abfrage genauer warum sie so lange dauert. Meist handelt es sich um große Datenmenge, Deadlocks und/oder zu tief-verschachtelte Abfrage mit Gruppenfunktionen und nicht zuletzt die BDE-Bugs. Mit Hilfe von SQL-Monitor kann man die Zeiten verschiedener Abschnitte abschätzen (SQL-PL/SQL-Ebene , Transport-Ebene und Applikationsebene). Meist durch geeignete Tabellenstrukturänderung kann man solche Probleme sehr elegant lösen. Nur Mut zur Änderung !

      Thread zu terminieren geschieht nur auf Applikationsebene. Oracle führt diese Abfrage trotzdem bis zum Ende weiter durch (vermute ich mal).

      Viel Spaß bei der Suche

      Comment


      • #4
        Hallo,

        immer dann, wenn das eigene Programm über LOCAL SQL (also über die BDE in Funktion des SQL-Interpreters) auf eine Datenbank zugreift, kann man über <b>DbiRegisterCallback</b> einen <b>dbGENPROGRESS</b>-Callback aktivieren. Wenn die BDE das eigene Programm zurückruft, kann man die Aktion abbrechen. Außerdem steht bei einigen Datenbanken das <b>OnServerYield</b>-Ereignis zur Verfügung, wo man über den Parameter <b>AbortQuery</b> die laufende Abfrage abbrechen kann. Für beide Alternativen ist jeweils ein Beispielprogramm in meinem alten Buch <i>Delphi 3 Datenbankentwicklung</i> zu finden.

        Allerdings verhalten sich SQL-Server völlig anders - lt. SQL ist ein späteres Abbrechen eines abgeschickten Kommandos nicht vorgesehen (d.h. man muss vorher prüfen, was das abgeschickte Kommando anrichtet). Die einzige dokumentierte Option besteht darin, die Datenbankverbindung (Session) zu beenden. Viele SQL-Server schauen regelmässig bei langen Abfragen nach, ob der Client "noch lebt" und brechen intern ab, wenn die Verbindung nicht mehr aktiv ist

        Comment

        Working...
        X