trhead in sql problem

Dbase, sql, paradox in vse drugo kar se tiče baz.
Odgovori
Fortuna
Prispevkov: 1097
Pridružen: 26.06.2004 09:59:52

trhead in sql problem

Odgovor Napisal/-a Fortuna » 08.09.2010 11:32:59

Po dolgem času testiranj končno znam ponoviti napako.





Uporabljam zesolib.


sql v trhead dela ok ,če se izvaja zaporedno.


Če se pa izvede hkrati


Če prvi select v trhead 1 ni kočan ko začne drugi select v trhed2 potem crken in javi invalid adress ali da je povezava prekinjena.

Če drugi trhed zaženem ko prvi trhead 1 konča select naredi ok,



trhead 1
query1.sql.add(select

trhead 2 in select ni končan
query2.sql.add(select



Podobno se zgodi, če v glavni niti naredim select, takrat ko dela select v trhead -u.

In če potem ponovim select v glavni niti, ko je trhead končan naredi ok.

Je kdo delal kaj podobnega v delphi in kakšne izkušnje ima s tem.

hvala

odisej
Prispevkov: 1363
Pridružen: 09.05.2003 12:58:10

Re: trhead in sql problem

Odgovor Napisal/-a odisej » 08.09.2010 12:04:15

ZeosLib ne poznam, nekaj pa sem delal z ADOQuery v threadih. Potrebno je bilo klicati CoInitialize.

Fortuna
Prispevkov: 1097
Pridružen: 26.06.2004 09:59:52

Re: trhead in sql problem

Odgovor Napisal/-a Fortuna » 08.09.2010 13:22:35

With Firebird Embedded is it that you can only have 1 connection (i.e.
TIBConnection) at a time, or that only 1 process can access the database
at a time?

After reading this a few posts ago:
"How do you do Zeos and threads?"

"That is a general simplification of the rule to practically
all data access components. The rule itself is - a connection object
and assocciated data access components must be used by a single
thread in every moment of a time."

Does this mean that I can't use multiple threads (i.e. each thread has
it's own connection object) if using Firebird Embedded?


Tu se sicer sklicuje Firebird Embedded.
Vendar je precej verjetno, da rabi vsak thread svoj connect.

Bemti skoz sem milslil, da me zajebava thread.

V testu je v glavnem delal. In ko sem ves navdušen dal zadevo v produkcijo.
Je v produkcije glavnem NE delal.
Cel mesec se zajebavam z to traparijo.
grrrr

Silver_War
Prispevkov: 664
Pridružen: 01.06.2004 14:50:41

Re: trhead in sql problem

Odgovor Napisal/-a Silver_War » 08.09.2010 15:53:44

Fortuna napisal/-a:Vendar je precej verjetno, da rabi vsak thread svoj connect.
Precej verjetno? Reci kar sigurno.
Nareč podatkovna baza je dejansko svoj objekt s katerim komuniciraš s pomočjo določenih ukazov. In ko se ti povežeš na podatkovno bazo ona pri sebi ustvari svojo nit, ter določene spremenljivke (recimo izbran/i zapis/i) s pomočjo katerih omogoča izvajanje večih zaporednih ukazov na enem oz. večih zapisih. In če boš ti sedaj s pomočjo večoih niti pošiljal ukaze na to vspostavljeno povezavo z bazo, jih bo podatkovna baza izvajala zaporedno tako kot bojo prihajali. In ko recimo prva nit pošlje ukaz "select", podatkovna baza izbere zapis oz. več zapisov glede na kriterije podane z ukazom. Če takoj po tem druga nit pošlje ukaz "select", bo podatkovna baza izbrala zapis oz. več zapisov glede na kriterije podane z ukazom "select", ki je prišel nazadnje. IN ko bo prva nit poslala nek ukaz, se bo le ta izvedel oz. poizkusil izvest na izbranem oz. izbranih zapisih, ki so bili izbrani z ukazom "select", ki ga je podatkovna baza prejela od druge niti. In tu pri tebi nastane problem.
Zato če hočeš dostopat do podatkovne baze iz večih niti se mora vsaka nit uporabljat svojo povezavo na podatkovno bazo, ker le tako podatkovna baza zna kater zapis je bil izbran od katere niti ter tako zagotovi, da se ukazi izvajajo na pravih zapisih.

Fortuna
Prispevkov: 1097
Pridružen: 26.06.2004 09:59:52

Re: trhead in sql problem

Odgovor Napisal/-a Fortuna » 08.09.2010 18:19:59

Silver_War napisal/-a:
Fortuna napisal/-a:Vendar je precej verjetno, da rabi vsak thread svoj connect.
Precej verjetno? Reci kar sigurno.
Na firebrid je tako in hvalabogu končno bi program deluje kot mora.
Na nekem forum sem prebral, da pa firebird ne podpira da pa interbase podpira več niti en connect tudi z componentami zeoslib.
Vendar z interbase nisem nikoli delal.

lp

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Re: trhead in sql problem

Odgovor Napisal/-a Runner » 09.09.2010 09:38:18

To velja samo za Firebird Embedded. In to jasno in glasno piše v dokumentaciji, da imaš lahko odprt samo en connection naenkrat na bazo. Torej baza se odpre v exclusive mode-u, kar je kar logično glede na to da nima strežnika ampak samo dll ki dostopa direkt do baze. To seveda ne velja za full firebird.

Poglej si SQLite ki dovoljuje sočasne selecte z več niti / procesov. Ampak update lahko dela pa samo eden:

http://www.sqlite.org/faq.html#q5

Fortuna
Prispevkov: 1097
Pridružen: 26.06.2004 09:59:52

Re: trhead in sql problem

Odgovor Napisal/-a Fortuna » 09.09.2010 23:12:29

Sem ponovil testiranje !

Brez dvoma FirebirdSS-2.1.3 ne podpira več niti en connect.
Mislim pa da večina plačljivih serverjev to podpira.
Pri firebirdu bo potrebno počakat na nove verzije.
lp.

Fortuna
Prispevkov: 1097
Pridružen: 26.06.2004 09:59:52

Re: trhead in sql problem

Odgovor Napisal/-a Fortuna » 05.10.2010 17:03:35

Evo, Firebird 2.5 je zunaj: http://www.firebirdsql.org/index.php?op ... 25_release
they can be used in multi-threaded applications.

Podpira multi-threaded.

Uporabniški avatar
gabr
Prispevkov: 4129
Pridružen: 28.08.2001 14:10:47

Re: trhead in sql problem

Odgovor Napisal/-a gabr » 05.10.2010 18:15:28

Da smo si na jasnem - FB 2.x Embedded čisto lepo podpira več hkratnih connectov iz več threadov na bazo. To funkcionalnost uporabljam v naših serverjih in špila krasno.

Je pa ena finta - dva threada ne smeta hkrati narediti connect, ker se mu potem strga. Tako da je treba connected zavarovat s kritično sekcijo, queryje pa lahko potem šibaš po želji.

Fortuna
Prispevkov: 1097
Pridružen: 26.06.2004 09:59:52

Re: trhead in sql problem

Odgovor Napisal/-a Fortuna » 26.05.2012 19:03:55

Požreš tablete pa ni z trhedomom nimaš več težav

Odgovori