Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 Uhr.
Seite 1 von 2  1 2      

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