Problema con pool connessioni

sabato 06 agosto 2011 - 12.19
Tag Elenco Tags  VB.NET  |  Windows Server 2008 R2  |  Visual Studio Express  |  SQL Server 2008 R2

michela85 Profilo | Newbie

Buongiorno a tutti!
Ho ereditato in gestione un sito in asp.net. Da quando i gestori del server hanno cambiato la macchina, il sito mi dà errore sul pool di connessioni.
Questa è la classe per le connessioni:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ho verificato che tutte le aperture della classe DBGest avessero il metodo DBchiudi, tranne nel caso in cui viene richiamato il metodo estrai, poichè la connessione viene aperta e chiusa nello metodo stesso.

Nonostante tutto, dopo un paio di giorni, l'errore si è ripresentato, nonostante un Max Pool Size reimpostato a 200... Qualche idea? Devo aggiungere il Dispose al metodo DBchiudi?... il problema poi può includere solo le connessioni al DB o anche altri elementi?

alx_81 Profilo | Guru

>Buongiorno a tutti!
Ciao

>Ho verificato che tutte le aperture della classe DBGest avessero
>il metodo DBchiudi, tranne nel caso in cui viene richiamato il
>metodo estrai, poichè la connessione viene aperta e chiusa nello
>metodo stesso.
Il problema è che anche se il codice prevede la chiamata alla chiusura potrebbero esserci casi in cui la connessione non si chiude.
Trattandosi di web site infatti, potrebbe succedere che qualche errore nega la connessione, che qualche chiamata ci metta troppo tempo e chi naviga chiuda la pagina ancora prima di chiudere la connessione, ecc.
Dovresti rifattorizzare la chiamata utilizzando il costrutto using:
http://msdn.microsoft.com/en-us/library/htd05whh.aspx

in questo modo, invece che utilizzare la classe che ci hai passato, dovresti fare, per ogni chiamata una cosa del genere:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

con la using, che può essere usato per tutti gli oggetti che implementano la IDisposable (anche i tuoi ai quali fai implementare quell'interfaccia) tutte le chiusure e i rilasci della memoria sono automatici, ed è il framework a usare correttamente il garbage collector.



--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

michela85 Profilo | Newbie

Documentandomi su questo forum avevo già trovato questa soluzione, ma ho immaginato che non ci fosse un modo per implementare una classe usando USING e quindi risparmiare tempo, mi sbaglio?

Una domanda: è solo una coincidenza il fatto che i problemi sono sorti da quando ci hanno cambiato il server, passando a sql server R2?

alx_81 Profilo | Guru

>Documentandomi su questo forum avevo già trovato questa soluzione,
>ma ho immaginato che non ci fosse un modo per implementare una
>classe usando USING e quindi risparmiare tempo, mi sbaglio?
in realtà tu puoi farti il tuo livello di astrazione per connetterti al database ed eseguire comandi, perchè no..

>Una domanda: è solo una coincidenza il fatto che i problemi sono
>sorti da quando ci hanno cambiato il server, passando a sql server R2?
diciamo che se non è stato compiuto l'elenco dei passi necessari sul nuovo db (tipo la reindicizzazione) potrebbe essere che le nuove query siano più lente di quelle eseguite sul vecchio server e quindi il problema si è accentuato..

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

michela85 Profilo | Newbie

>in realtà tu puoi farti il tuo livello di astrazione per connetterti
>al database ed eseguire comandi, perchè no..

scusa, ma non sono molto pratica di asp.net ... potresti farmi un esempio?

alx_81 Profilo | Guru

>scusa, ma non sono molto pratica di asp.net ... potresti farmi
>un esempio?
sono tornato da poco dalle ferie.. scusa il ritardo..
comunque guarda questa risposta:
http://stackoverflow.com/questions/6148131/how-to-make-and-use-db-connection-class-using-csharp

quella segnata come accettata utilizza la using per eseguire un comando di lettura.
Alla fine basta fare una classe che per ogni operazione di lettura lancia un metodo come quello, per eventuali metodi di scrittura lancia l'execuenonquery di ado.net (e non il reader) e così via.
Basta poi fare una classe config su cui metti almeno una proprietà statica (la connectionstring) che magari legge dall'app.config:
http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/9a8c9f5a-092e-4c4a-87bb-9f35d8f55da1/
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5