AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi MySQL-Abfrage in Thread verpackt, trotzdem Programmbremse
Thema durchsuchen
Ansicht
Themen-Optionen

MySQL-Abfrage in Thread verpackt, trotzdem Programmbremse

Ein Thema von christian_r · begonnen am 5. Jan 2009 · letzter Beitrag vom 9. Jan 2009
Antwort Antwort
christian_r
(Gast)

n/a Beiträge
 
#1

MySQL-Abfrage in Thread verpackt, trotzdem Programmbremse

  Alt 5. Jan 2009, 20:30
Ich habe eine permanente MySQL-Abfrage für mein Remote-Tool. Diese habe ich daher in einen Thread verpackt.
Ich verwende die Komponentensammlung "MySQL Direct".

Meine Tests liefen über die MySQL-Verbindung zu meinem "localhost" sehr flüssig. Nachdem ich nun eine Verbindung zu meinem Server online aufbaue, bremst die MySQL-Query das Programm trotz allem aus.

Delphi-Quellcode:
type
  TForm1 = Class( TForm )
    ThreadCommand : TThreadCommand;
    MySQL : TOMySQL; // Ein Wrapper für 'TMySQLClient' von MySQL Direct
  end;

// ...

Self.ThreadCommand := TOThreadCommandOrder.Create( True );
Self.ThreadCommand.FreeOnTerminate := True;
Self.ThreadCommand.Priority := tpNormal;
Self.ThreadCommand.MySQL := Self.MySQL;

// ...

procedure TThreadCommand.ProcessCommand
          ( );
var
  MySQLResult : TOMySQLResult; // Ein Wrapper für 'TMySQLResult' von MySQL Direct
begin
  if Assigned( Self.MySQL ) then
  begin
    MySQLResult := Self.MySQL.Query( 'SELECT * FROM `ubig_orders` LIMIT 0, 1' );
    // ...
  end;
end;
Ich kann versichern, dass das Problem nicht an den Wrappern für die MySQL-Klassen liegt. Ich habe den Quellcode in den Wrapper geprüft und festgestellt, dass der Aufruf von TMySQLClient.Query( ) bereits ausbremst.

Liegt es nun an meiner Art und Weise den Thread zu verwenden, was ich mir nicht vorstellen kann. Oder ist die MySQL Direct Komponente problematisch? Normalerweise sollte ich doch von dem Prozess im Thread nichts mitbekommen.
  Mit Zitat antworten Zitat
christian_r
(Gast)

n/a Beiträge
 
#2

Re: MySQL-Abfrage in Thread verpackt, trotzdem Programmbrems

  Alt 6. Jan 2009, 11:43
Sorry, ich habe "TThreadCommand.Execute()" vergessen. Also ProcessCommand wird synchronisiert.

Delphi-Quellcode:
procedure TThreadCommand.Execute
          ( );
begin
  while not Self.Terminated do
    Self.Synchronize( Self.ProcessCommand );
end;
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: MySQL-Abfrage in Thread verpackt, trotzdem Programmbrems

  Alt 6. Jan 2009, 19:12
Wenn du alles über Synchronize aufrufst, wird auch alles über den Hauptthread berechnet. Deswegen ist es auch eine "Bremse".
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: MySQL-Abfrage in Thread verpackt, trotzdem Programmbrems

  Alt 6. Jan 2009, 19:19
Hier bringt der Thread null und nix. Du solltest außerhalb von synchronize arbeiten. Dazu musst du aber alles, was SQL betrifft in den Thread legen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
christian_r
(Gast)

n/a Beiträge
 
#5

Re: MySQL-Abfrage in Thread verpackt, trotzdem Programmbrems

  Alt 9. Jan 2009, 07:29
Danke Euch. Läuft jetzt.

Und stimmt. Der Prozess des Programmes selbst verbaucht keine 50% mehr. Alles flüssiger.
  Mit Zitat antworten Zitat
christian_r
(Gast)

n/a Beiträge
 
#6

Re: MySQL-Abfrage in Thread verpackt, trotzdem Programmbrems

  Alt 9. Jan 2009, 10:35
Eine abschließende Frage zu diesem Thema.

Wenn ich im Hauptprogramm in "TForm.Destroy()" den Thread mit "Self.ThreadCommand.Terminate()" beende, wird jedesmal eine Exception explizit innerhalb des MySQL-Objektes von MySQL Direct (nicht im MySQL-Wrapper) ausgelöst. Alle anderen Objekte, wie z. B. das Log oder der CommandWrapper, verursachen keine Exception. Ich muss den Thread jedesmal vorher suspendieren, was ich jetzt mit einer überschriebenen Methode "TThreadCommand.Terminate()" gelöst habe.

Woran kann das liegen? Die Objekte, die ich dem Thread übergebe, werden nicht im Thread zerstört, sondern im Hauptprogramm.

Ja, die Frage ist vage, sofern ihr auch die Quellcodes nicht kennt. Aber vllt. kennt jemand dieses Problem brerits, oder kennt die Funktionsweise von MySQL-Direct.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: MySQL-Abfrage in Thread verpackt, trotzdem Programmbrems

  Alt 9. Jan 2009, 10:44
Du übergibst dem Thread Objekte? Das geht schief. Und zwar meist erst beim Kunden und dann immer zufällig.

Ich nehme (ohne Quelltext) an, du hast nicht die gesamte DB-Arbeit in den Thread gelegt sondern übergibst nur die Query. Das geht so nicht. Du musst den Thread vom Hauptprogramm komplett trennen und im Nachhinein überlegen, welche Schnittstellen zwischen beiden notwnedig sind.

Also hier heißt es alle Datenbankkomponenten in den Thread.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
christian_r
(Gast)

n/a Beiträge
 
#8

Re: MySQL-Abfrage in Thread verpackt, trotzdem Programmbrems

  Alt 9. Jan 2009, 12:02
Hm ...

Meine bisherige Überlegung war, dass der Thread eine MySQL-Verbindung übergeben bekommt, die im Haupthread instanziert wird. Somit kann ich zukünftig parralel laufenden Threads ein und dasselbe DB-Objekt übergeben und muss nicht 10 verschiedene Verbindungn aufbauen. Aber ... hm ... jetzt klickt es so langsam. Wenn ich dann natürlich 10 Threads auf ein und dieselbe Instanz gleichzeitig zugreifen lasse könnte es Probleme geben, die ich jetzt noch nicht absehen kann.

Können zwei Threads gleichzeitig auf ein und die selbe Methode von ein und der selben Instanz eines Objektes zugreifen ohne Probleme zu verursachen?

Ich verstehe grad noch nicht so richtig, warum ich den Thread komplett "eigenständiug" konstruieren muss. Welche Probleme gibt es sonst, außer dem, welches ich hier beschrieben hatte?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: MySQL-Abfrage in Thread verpackt, trotzdem Programmbrems

  Alt 9. Jan 2009, 13:12
Wenn du parrallel mit der Datenbank arbeiten willst, brauchst du IMHO sowieso mehrere Datenbankverbindungen. Also dann jeweils eine pro Thread (aber zuviele aktive Threads verträgt das System eh nicht).

Ich mach es immer so, dass ich in meinen Projekten ein Thread habe der nur für die Kommunikation mit der Datenbank zuständig ist. Und auch nur dieser Thread ist mit der Datenbank verbunden. Da sind alle Komponenten für die Datenbank enthalten, die ich benötige. Und dieser Thread schläft meistens, bis ich ihm eine neue Aufgabe über eine Liste (bspw: TThreadList) gebe. Die erledigt er und gibt mir im Anschluss das Ergebnis.

Zitat:
Können zwei Threads gleichzeitig auf ein und die selbe Methode von ein und der selben Instanz eines Objektes zugreifen ohne Probleme zu verursachen?
Riesenprobleme (wegen derselben Instanz, selbe Methode wäre kein Problem). Du greifst u.U gleichzeitg auf eine Variable/Feld zu. Such mal hier im Forum, da gibt es viele Aussagen dazu.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
christian_r
(Gast)

n/a Beiträge
 
#10

Re: MySQL-Abfrage in Thread verpackt, trotzdem Programmbrems

  Alt 9. Jan 2009, 13:24
OK, jetzt bildet sich so langsam ein klares Bild, auch im Zusammenhang mit dem WorkersThread. Und an die überschneidenden Zugriffe hatte ich bei meiner Konzeption erst gar nicht gedacht.

Danke. Soweit kann ich nun erst mal weiterarbeiten.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz