![]() |
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: ![]() |
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.
|
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!!! |
AW: mehrere Datenbankzugriffe gleichzeitig
ein kleines Tutorial gibts hier:
![]() ![]() |
AW: mehrere Datenbankzugriffe gleichzeitig
Wenn der Indy Client HTTP verwendet um mit dem Server zu sprechen, ist Apache JMeter ein praktisches Werkzeug:
![]() 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. |
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.
|
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? |
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. |
AW: mehrere Datenbankzugriffe gleichzeitig
Zitat:
Du darfst aus dem Thread auf die Variable Counter im Form nur über Synchronize oder eine critical section zugreifen. |
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 03:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz