Announcement

Collapse
No announcement yet.

TQuery und Thread

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

  • TQuery und Thread

    Hallo,

    ich habe eine massives Thread-Problem.

    In meiner Applikation werden zwei Oracle-Datenbanken (datensatzweise) kopiert. Dieses findet in jeweils einem eigenen Thread statt.
    Werden die einzelnen Thread nacheinander gestartet, läuft es wunderbar - nur - die Rechner langweilen sich.

    Wenn ich zur gleichen Zeit max. 10 Threads starten lasse, bekomme ich beim zweiten "TQuery.Open" (in dieser werden die Datensätze eingefügt, die abgeglichen werden müssen, über "Insert Into" geht es nicht, da ich long-Felder habe) eine fette Zugriffsverletzung und kann nur noch über CTRL-F2 abbrechen. Ohne Delphi kommt Dr. Watson, machmal wird mein Programm auch ohne Meldung aus dem Speicher gekickt.

    In jedem Thread wird eine andere Tabelle abgearbeitet, d.h. es findet zur gleichen Zeit KEIN Zugriff auf ein und diesselbe Tabelle statt (doch: eine Protokolltabelle - die funktioniert aber, hier greife ich über "insert into" zu).

    Ich habe das ganze mal auf "Direct Oracle Access" von Allround Automations (www.allroundautomations.nl) umgesetzt und getestet. Hier gibts absolut keine Probleme. Geht übrigens auch noch ca. 5 mal so schnell wie mit der BDE. (Ist aber nur eine Zukunftslösung, da die Hauptapplikation über die BDE zugreift - DOA for future release)

    Kann mir jemand helfen, wo ich ansetzen kann?

    Vielen Dank im Voraus

    Michael Habbe

  • #2
    Hallo,

    verwendet jeder Thread auch wirklich eine eigene TSession- und TDatabase-Instanz? Ist ein ODBC-Treiber beteiligt? Wenn ja, hat dieser mindestens die Versionsnummer 3.x

    Comment


    • #3
      Hallo Herr Kosch,

      ich übergebe beim Create des Threads die Source/Destination-Database aus dem Hauptformular über den Construktor an jeden einzelnen Thread.

      hier der Construktor:

      constructor TAbgleichTempThread.Create(CreateSuspended: Boolean;
      TableName, TableOwner: String;
      SourceDatabase, DestinationDatabase: TDatabase);

      begin
      inherited Create(CreateSuspended);

      fTableName := TableName;
      fTableOwner := TableOwner;
      fSourceDatabase := SourceDatabase;
      fDestinationDatabase := DestinationDatabase;
      end;

      f...Database wird dann den einzelnen Queries zugewiesen.

      Ein ODBC-Treiber ist nicht beteiligt.

      Danke

      Michae

      Comment


      • #4
        Hallo,

        das kann so <b>nicht</b> funktionieren. Jeder Thread braucht eine <b>eigene</B> Datenbanksitzung, also eine eigene TSession-/TDatabase-Instanz, die vom primären Thread <b>nicht</b> ebenfalls genutzt werden darf

        Comment


        • #5
          Hallo,

          da ja nun jeder Thread eine eigene Sitzung bräuchte, hiesse dieses auch, daß sich jeder Thread an Oracle anmelden müsste. Ich habe diesen Weg jetzt nicht mehr weiterverfolgt, sondern habe wie oben schon beschrieben das Projekt auf "Direct Oracle Access" weiter ausgebaut. Hier kann ich wie beschrieben die bestehende "Database" (hier TOracleSession) wie gehabt über den Konstruktor übergeben.

          Meine Erfahrungen bis jetzt: 100% besser zu handhaben als der (Um)Weg über die BDE.

          Ich kann nur jedem mal empfehlen, der mit Oracle arbeitet, diese Komponenten einmal auszuprobieren. Zu finden unter http://www.allroundautomations.nl

          Gruß

          Michael Habb

          Comment

          Working...
          X