Newsgroup: it.comp.lang.visual-basic
Titolo: ADO.Net e multithreading

Ciao a tutti,
ho una applicazione multithread, dove ciascun thread può eseguire
operazioni sul db. Apro una connessione unica verso il db (Microsoft SQL
Server 2005) che uso per aprire i vari datatable che mi servono.
L'applicazione funziona quasi correttamente, dico quasi perché in modo del
tutto random mi capita un errore nell'apertura del dataadapter dove risulta
che lo stesso è già in uso, anche quando accedo solo in lettura.
Chiaramente in ogni classe instanziata dai thread ho un dataadapter
dedicato, che però si appoggia alla connessione globale e comune a tutti
gli altri thread. Inoltre ho "atomizzato" gli accessi al db dove per ogni
accesso instanzio il dataadapter e il sqlcommand tramite using (per essere
sicuro della deallocazione).
Il problema credo di poterlo risolvere con l'uso dei semafori (synclock con
oggetto shared), modifica che mi costa un po' di tempo, ma prima vorrei
sapere se siete a conoscenza di problemi di 
ado.net
 a gestire accessi
multipli e contemporanei sulla stessa connessione.
Grazie per ogni risposta.
PaF

 Grazie per ogni risposta.
Ciao,
premetto che sono piuttosto ignorante in 
ADO.NET
 quindi non so quanto 
corretto sia quello che sto per scrivere ne quanto possa esserti 
eventualmente utile, comunque ...
In 
ADO.NET
 le connessioni dovrebbero essere gestite tramite pooling che 
di default è attivo, non è che ti viene restituito l'errore quando il 
connection pooling è arrivato al numero max di aperture impostato?
Guarda se magari questo può risultarti utile:
http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx
Spero di non aver cannato troppo, diversamente ... scusa :-)
ciao
stefano

Il Fri, 06 Mar 2009 16:58:27 +0100, Stefano Ferrari ha scritto:
[cut]
Grazie per il suggerimento, verifico, anche se a spanne mi sembra più un
errore da "collissione" intra-thread.
PaF
PS.
Fare il debug di applicazioni multithread mi fa venire l'orticaria :-/

 PaF
Quello che dico qui sotto è imho....non pretendo che sia la soluzione
giusta ...e posso anche dire cazzate (vista la suscettibilità media
del ng in questo periodo...meglio fare questa premessa)
Non conosco il perchè tu debba "farti del male" in questo
modo...cmq....
il problema della deallocazione è annoso e difficilmente risolvibile
in dotnet
anche ad usare using (alias dispose) non sei mai sicuro di nulla!
In questo i bei tempi del vb6 set pippo=nothing sono ancora ricordati
con affetto!
http://www.dotnet2themax.it/blog/PermaLink,guid,145b93d4-eb4d-4bfd-a5e3-9d1da99f03e0.aspx
Inoltre....un piccolissimo appunto....
se apri un dataadapter metti in mezzo un altro oggetto ingombrante(che
anche lui deve essere gestito...rilasciato...coccolato...).....perchè
non fai tutto da codice?
Per di più....se come dici fai "aperture in lettura"
perchè non leggi questo?
usa un datareader e il metodo fill
http://groups.google.it/group/it.comp.lang.visual-basic/browse_frm/thread/8d45b314a5866ceb/ca93a50c67325c9d?hl=it&lnk=gst&q=datareader+fill#ca93a50c67325c9d
poi usa i vari command....guadagni anche parecchio in velocità!
...però scrivendo e riflettendo.....
che cazzo sto scrivendo!???!!!!
Tu non sei in questa situazione...vediamo se ho capito....
Tu hai un programma che connette un db (casomai è sqlserver...per
risparmiare sulle licenze eh????).....tu interroghi quel programma per
farti dare dati dal db!
E' logico che in un ambiente multithread...ogni tanto qualche
richiesta arriva troppo veloce....e il db non ti può rispondere!
Beh o usi una coda o un timeout...o tutti e due
quindi una bella collection di oggetti "richiesta dati"
o usare l'oggetto Queue (non l'ho mai usato...ma ad idea..!!!)
e il tuo programma che pesca da li le cose da fare!
Il tuo infatti non è un problema di connection pool ...magari lo
fosse!!!
Tu hai bloccato ad UNA connessione il programma....e in particolari
colli di bottiglia...gli chiedi troppe cose che non può soddisfare!
L'alternativa quindi è schedulare le richieste!
Perchè il programma non puoi aprire un altra connessione per
soddisfare 2 richieste di aggiornamento dati...per default glielo
impedisci!
Però gli devi chiedere tante cose....non sono esperto di
SQLserver....ma fino ad un certo limite le richieste le mette in coda
da se!
Forse gli lanci una stored di aggiornamento che dura qualche minuto???
Può darsi che abbia detto cazzate...
Saluti!