Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi mehrere Datenbankzugriffe gleichzeitig (https://www.delphipraxis.net/176233-mehrere-datenbankzugriffe-gleichzeitig.html)

cult6 21. Aug 2013 08:15

mehrere Datenbankzugriffe gleichzeitig
 
Hallo! Ich habe ein kleines Problem. Ich möchte so eine Art Server Stresstest Tool entwickeln. Ich habe bereits ein Programm entwickelt, welches über Indy an den Server Anfragen schickt, dieser leitet dann direkte Abfragen an die Firebird Datenbank weiter. Die erhaltenen Daten gehen wiederum zurück an das Stresstest Tool. Mein Ziel ist es, mehrere virtuelle Clients im Stresstest tool zu erstellen, welche dann zeitgleich auf das Servertool zugreifen. Wie ist das möglich?? Ich kann zwar in einer Schleife mehrere solche virtuellen Clients anlegen und arbeiten lassen, aber die arbeiten dann wieder nur Schritt für Schritt. Ich möchte wirklich erreichen dass zB 50 Clients zeitgleich an das Servertool Anfragen schicken und die Antworten wieder erhalten. Bin für jede Hilfe dankbar und hoffe ich habe mich verständlich ausgedrückt :)

PS: Ich arbeite mit Delphi 2009 Professional

Crosspost: http://forum.delphi-treff.de/index.p...475#post435475

MarcoWarm 21. Aug 2013 09:08

AW: mehrere Datenbankzugriffe gleichzeitig
 
Die Antwort auf deine Frage lautet Threads. Jeder "virtuelle Client" wird in einem Thread realisiert und werkelt dann "gleichzeitig" mit den anderen um die Wette.

cult6 21. Aug 2013 09:33

AW: mehrere Datenbankzugriffe gleichzeitig
 
Hy, danke! Hab ich mir schon gedacht, bin auch gerade dabei dies zu versuchen. Habe probehalber mal 2 Threads erstellt und darin jeweils einen Client. Ein Thread alleine funktioniert super, also kann ich mal davon ausgehen dass ich beim Erstellen meiner Klasse und der Thread.Execute Procedur keinen Fehler gemacht habe. Jedoch wenn ich mehrere erstelle und hintereinander gleich losarbeiten lassen möchte, kommt es zu Fehlern.

"Erste Gelegenheit für Exception bei $774F4B32. Exception-Klasse EInOutError mit Meldung 'E/A-Fehler 32'. Prozess Top_Stresstest.exe (3476)"

Ich muss dazu sagen ich arbeite das 1. mal mit Threads, ich verstehe zwar ihren Sinn aber noch nicht wie man sie richtig anwendent bzw. was man alles beachten muss. Muss ich die von Hand Synchronisieren oder so? danke!!!

MarcoWarm 21. Aug 2013 10:25

AW: mehrere Datenbankzugriffe gleichzeitig
 
ein kleines Tutorial gibts hier:
http://delphi.about.com/od/kbthread/a/thread-gui.htm

http://delphi.about.com/od/kbthread/..._threading.htm

mjustin 21. Aug 2013 10:34

AW: mehrere Datenbankzugriffe gleichzeitig
 
Wenn der Indy Client HTTP verwendet um mit dem Server zu sprechen, ist Apache JMeter ein praktisches Werkzeug:

http://jmeter.apache.org/

Es kann (über einen JDBC Treiber) aber auch direkt die Datenbank ansprechen und damit den Server unabhängig vom Indy Teil messen.

Die Performance Reports von JMeter sind sehr umfangreich und auch graphisch darstellbar.

OlafSt 21. Aug 2013 13:28

AW: mehrere Datenbankzugriffe gleichzeitig
 
E/A Fehler 32 sieht nach "File already opened" aus. Sieh zu, das die Threads nicht alle in das gleiche Logfile schreiben ;) Oder bastel eine Klasse, die in das Logfile schreibt, aber von den Threads mit entsprechenden Daten gefüttert wird.

cult6 21. Aug 2013 13:29

AW: mehrere Datenbankzugriffe gleichzeitig
 
Danke, das hat mir sehr geholfen, aber nun zum nächsten Problem...

Ich habe zb 3 Threads erstellt und lasse sie hintereinander ablaufen:

thread1 := TThreadClient.Create(false);
thread2 := TThreadClient.Create(false);
thread3 := TThreadClient.Create(false);

das funktioniert auch ohne Probleme, die Threads laufen, ABER...

ich habe auf meiner Form1 eine Variable Counter, welche beim FormCreate mit 0 initialiesiert wird.
Beim TThreadClient.Execute() wird diese Variable jeweils um 1 hochgezählt. Soweit so gut...

Jetzt sollte ja eigentlich thread1 Nr1 beinhalten, thread2 Nr2 usw. aber alle 3 Threads haben Nr3.
Jemand ne Idee wie ich dem entgegenwirken kann?

Jumpy 21. Aug 2013 14:47

AW: mehrere Datenbankzugriffe gleichzeitig
 
Die Variable muss doch "im Thread" lokal gespeichert sein. Wenn alle auf die selbe Variable zugreifen, die in Form1 steht, muss die ja bei allen 3 sein.

Du kannst also schon so eine counter variable verwenden und bei jedem neuen Thread hochzählen. Der dann aktuelle Wert muss aber dann auch "im Thread" gespeichert werden.

Olli73 21. Aug 2013 15:22

AW: mehrere Datenbankzugriffe gleichzeitig
 
Zitat:

Zitat von cult6 (Beitrag 1225686)
ich habe auf meiner Form1 eine Variable Counter, welche beim FormCreate mit 0 initialiesiert wird.
Beim TThreadClient.Execute() wird diese Variable jeweils um 1 hochgezählt. Soweit so gut...

Wenn du es so umgesetzt hast, wie es sich anhört, ist es aber gar nicht gut.
Du darfst aus dem Thread auf die Variable Counter im Form nur über Synchronize oder eine critical section zugreifen.

Blup 21. Aug 2013 15:57

AW: mehrere Datenbankzugriffe gleichzeitig
 
Der Constructor des Threads wird noch im Hauptthread ausgeführt, da darf man auch auf diese Variable zugreifen.
Besser wäre allerdings eine Klassenvariable in der Thread-Klasse geeignet.
Delphi-Quellcode:
type
  TMyThread = class(TThread)
  protected
    class var FLastNum: Integer;
    FMyNum: Integer;
  public
    constructor Create(ASuspended: Boolean); override;
    class property LastNum: Integer read FLastNum;
  end;

constructor TMyThread.Create(ASuspended: Boolean);
begin
  inherited;
  Inc(FLastNum);
  FMyNum := FLastNum;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:18 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