Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenbanken und INSERTS in Threads (https://www.delphipraxis.net/37052-datenbanken-und-inserts-threads.html)

Tonic1024 30. Dez 2004 11:08


Datenbanken und INSERTS in Threads
 
Hi...

Ich habe mal eine Frage betreffend Insert-Anweisungen und Threads.

Kleine Vorgeschichte:

Ich habe zu einer fremden Datenbank (IB) eine Applikation geschrieben. Weil die Datenbank von einer Fremdfirma ist - und man ja nie wissen kann - habe ich mich dazu entschlossen alle Zugriffe in eine externe DLL zu verlagen und ausschließlich ANSI-SQL zu verwenden. So kann ich relativ flexibel auf Veränderungen der DB reagieren.

Nun möchte ich eine Weitere kleine Software, die bei der DB dabei war ersetzen. Diese Software hat eine ASCII-Schnittstellendatei verarbeitet und in die DB geschrieben. Dafür hat sie eine Stored Procedure verwendet. Da dies nicht in mein Konzept passt realisiere ich dies mit einem INSERT-Statement. Klappt auch, dauert nur etwas länger, was ja auch logisch ist.

Daraus ergibt sich automatisch meine Frage:
Ich habe nun versucht das "Array-Monster" mit den zu verarbeitenden Daten an zwei unabhängig laufende Threads zu übergeben. der eine solldie graden Einträge verarbeiten (daten[2], daten[4], ...) der andere die ungraden (daten[1], daten[3], ...). Wenn ich den einen Thread laufen lasse und den andern nicht starte werden auch die jeweiligen Daten (gerade oder ungerade) korrekt übertragen. wenn ich aber beide gleichzeitig laufen lasse geht garnichts. Wiso das?

Ich benutze ExecuteDirect aus TSQLConnection mit den Einstellungen KeepConnection:=true (scheint mir schneller zu gehen).


Hoffe jemand weiss Rat oder zumindes warum dies so ist...

MfG

Tonic

Bernhard Geyer 30. Dez 2004 11:27

Re: Datenbanken und INSERTS in Threads
 
Du solltest uns noch verraten auf welche Datenbank du zugreifst.
Evtl. ist auch der dbExpress-Treiber nicht Multi-Threading fähig.

Tonic1024 30. Dez 2004 16:12

Re: Datenbanken und INSERTS in Threads
 
Ich benutze, wie schon gesagt, IB via ANSI-SQL.

Wie finde ich heraus ob der Threading fähig ist? Kann man das irgendwo nachlesen?


[/edit]
Nach allem was ich weiss ist DBExpress Threadfähig wenn für jeden Thread eine eigene TSQLConnection vorhanden ist und diese Teilung konsquent umgesetzt wird. Aber ich bin mir dabei nicht wirklich sicher....
[edit]

Generalissimo 30. Dez 2004 16:20

Re: Datenbanken und INSERTS in Threads
 
Soweit ich weiss ist ANSI-SQL nur ne Art von SQL-Syntax.
Er meint aber den Zugriff auf die Datenbank. Ob DBExpress, IBX, ADO etc.

Tonic1024 30. Dez 2004 16:25

Re: Datenbanken und INSERTS in Threads
 
Ich benutze TSQLConnection. Das ist eine DBExpress-Komponente.

[kleinlaut] Ist sie doch, oder? [/kleinlaut]

Bernhard Geyer 30. Dez 2004 17:00

Re: Datenbanken und INSERTS in Threads
 
Zitat:

Zitat von Tonic1024
Nach allem was ich weiss ist DBExpress Threadfähig wenn für jeden Thread eine eigene TSQLConnection vorhanden ist und diese Teilung konsquent umgesetzt wird. Aber ich bin mir dabei nicht wirklich sicher....

Dann Probiers halt einfach mal aus. Da ich kein DBExpress verwende kann ich dir nicht mit Tests/Beispielen helfen.

Tonic1024 31. Dez 2004 08:20

Re: Datenbanken und INSERTS in Threads
 
Ich bin dir für deinen Versuch mir zu helfen sehr dankbar, aber ich denke ich habe oben (in meinem ersten Post) relativ deutlich beschrieben was bei diesen Versuchen herausgekommen ist.

Ich komm so nicht weiter.

CenBells 31. Dez 2004 15:55

Re: Datenbanken und INSERTS in Threads
 
hi,

machst du auch irgendwann nach dem einfügen mal nen commit? oder machst du den erst am ende des threads???

Gruß
Ken

Tonic1024 6. Jan 2005 15:45

Re: Datenbanken und INSERTS in Threads
 
Hi...


Da ja alle kleinen Projekte wichtiger sind als manche Große ( :cry: ) konnte ich meine Arbeit nicht so recht voranbringen die letzte Woche... Nun habe ich wieder die Möglichkeit...

Okay...

Ich habe beides Versucht. Commit nach jedem Insert und nur zum Schluss. Es scheint jedoch so, als wenn der Engpass nicht im Programm selbst steckt, sondern im Interbaseserver selbst. Denn in beiden Fällen laufen die beiden Threads zusammen wesendlich langsamer als eine einfache Schleife im Hauptprogramm.

Kann es sein, dass der Server die ganzen Anfragen nicht so schnell verarbeiten kann und besser "voran kommt" wenn man ihn langsam füttert? Ist es so? Kann man was dagegen tun? Jemand noch ne Idee??

MfG

Tonic

Jelly 6. Jan 2005 15:53

Re: Datenbanken und INSERTS in Threads
 
Hast du drauf geachtet, daß in jedem Thread eine EIGENE Datenbankverbindung erstellt wird. Ich hab noch nicht mit DBExpress gearbeitet, jedoch ist es bei der BDE (und auch bei den Zeos Komponenten) so, daß du all deine TTables etc. an eine DB Kompo bindest. Ist dies in beiden Thread die gleiche DB Verbindung, kann es zu Problemen kommen, wenn beide Threads gleichzeitig was an den Server schicken, da dies in der gleichen Transaktion passiert.

Tonic1024 6. Jan 2005 16:05

Re: Datenbanken und INSERTS in Threads
 
Ja, das ist in der Tat noch ein Problem.

Ich habe alle diese komponenten in einer DLL. Wenn ich auf ein und die selbe Datei (also die DLL) einen dynamischen Zugriff starte, dann geht es tatsächlich garnicht. Ich hab mich provisorisch damit beholfen, dass ich eine Kopie von der DLL gemacht habe und der eine Thread die eine DLL und der andere Thread die andere DLL benutzt. Wenn ich ein brauchbares Ergebnis erzielt habe werde ich mir da was anderes überlegen.

Aber das Problem ist ja nicht, dass es nicht geht, sondern dass die Threads zusammen locker 4 mal so lange brauchen um die Statements abzusetzen als die einfache Schleife. Ich komm nur nicht dahinter warum...


[edit]Ich lade die DLL pro Thread dynamisch - nicht pro Schleifendurchgang[/edit]


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