Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Connessioni a MySQL.
sabato 18 gennaio 2014 - 19.40
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Elenco Tags
C#
|
Visual Studio 2010
|
MySQL 5.5
iif
Profilo
| Expert
713
messaggi | Data Invio:
sab 18 gen 2014 - 19:40
Ciao a tutti,
ho una pagina in csharp che apre un file di testo e inserisce i record in una tabella.
Dopo tre/quattro caricamenti mi sono accorto che le connessioni sul db erano arrivate al limite consentito (200), sforando tale limite si blocca tutto e devo riavviare iis.
Esiste un comando che riporti a zero le connessioni dopo aver caricato ogni singolo file?
Spero di essermi spiegato.
Grazie.
0v3rCl0ck
Profilo
| Guru
1.120
messaggi | Data Invio:
sab 18 gen 2014 - 20:19
ciao, devi fare attenzione di avere correttamente chiuso le connessioni prima di uscire dai metodi di caricamento.
Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic
iif
Profilo
| Expert
713
messaggi | Data Invio:
sab 18 gen 2014 - 21:04
Fatto, ho anche aperto una connessione all'inizio per chiuderla alla fine dell'elaborazione.
Ho anche inserito il metodo dispose dopo la chiusura.
0v3rCl0ck
Profilo
| Guru
1.120
messaggi | Data Invio:
sab 18 gen 2014 - 21:56
prova a mettere nella connection string "Pooling=false"
sembrerebbe che l'implementazione di mysql gestisca diversamente la connection pool, vedi:
http://stackoverflow.com/questions/5567097/using-mysqlconnection-in-c-sharp-does-not-close-properly
facci sapere se è cambiato qualcosa con quel parametro
Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic
iif
Profilo
| Expert
713
messaggi | Data Invio:
dom 19 gen 2014 - 00:21
Ho inserito l'istruzione nel nella connectionstring di web.config, sembra funzioni.
Vi aggiorno in caso di news.
Grazie.
0v3rCl0ck
Profilo
| Guru
1.120
messaggi | Data Invio:
dom 19 gen 2014 - 14:21
ok bene, allora il problema risiede in questa connectionpool di mysql, dovresti investigare se davvero tieni aperto più di 200 connessioni parallele perchè non fai la close... oppure se evidentemente fare la close su una conn mysql non è sufficiente per far si che quest'ultima venga rimessa a disposizione per successive chiamate.
leggendo da qui:
http://dev.mysql.com/doc/connector-net/en/connector-net-programming-connection-pooling.html
sembra che sia sconsigliato creare manualmente la connessione fare la open e la close, ma lasciare gestire al connector il tutto, e sinceramente non capisco perchè abbiano dovuto cambiare il comportamento rispetto a ado.net... dice di usare la MySqlHelper e anche questa non mi convince, perchè da documentazione (
http://dev.mysql.com/doc/connector-net/en/connector-net-ref-mysqlclient-mysqlhelpermembers.html#connector-net-ref-mysqlclient-mysqlhelper-executenonquery-overloads
) dice che lascia aperta la connessione una volta eseguito il metodo.
L'unica è fare delle prove, fai un piccolo progetto di test, e prova qualche modo diverso... vedi se appena crei una mysqlconnection già viene creata prima di chiamare la open o dopo, e quante connessioni apre di default la pool guardando su le connessioni su mysql. Ovviamente con la pool dovrai sembre vedere connessioni aperte (e ti consiglio vivamente di utilizzare le connection pool, altrimenti non l'avrebbero messo di default per niente), ma non dovresti vedere incrementarsi le connessioni se fai un ciclo di Open e Close anche superando il numero di connessioni nella pool, perchè una connessione nuova deve essere creata solo quando hai tante connessioni Open quante sono presenti in pool e tu ne stai chiedendo un'altra... guarda se facendo solo la .Dispose() senza esplicitamente chiamare la .Close() la situazione migliore. Poi prova ad usare appunto la MySqlHelper per eseguire i comandi, passandogli solo la connectionstring senza creare tu stesso la connessione, e prova a vedere se utiizzando solo quella classe helper le connessioni rimangono sotto controllo, e cioè non crescono ad ogni singola chiamata (forse nella doc il fatto che ti dicano che la connessione rimane aperta, vuol dire che rimane aperta, ma appena il metodo ha finito viene rimessa in pool, ed è possibile che un altro metodo la riutilizzi, che sarebbe il giusto comportamento).
Rimane il fatto che non mi piace per niente che abbiano cambiato il comportamento rispetto al classico ado.net sql server, quest'ultimo alla prima conn.Open() su una qualsiasi connection, scatena la creazione della pool creando tante connessioni fino al minSize impostato sulla connection string, poi alla close della connection viene semplicemente rimessa nella pool, stessa cosa se si chiama la dispose, dato che la dispose chiama la close sulla connection. Invece con mysql sembra che se chiami la .Open e poi .Close manualmente, di fatto chiude la connessione e quindi non è più a disposizione nella pool, mah... che comportamento brutto!!
Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic
iif
Profilo
| Expert
713
messaggi | Data Invio:
dom 19 gen 2014 - 20:09
Cerco di darvi un quadro dell'analisi che ho fatto:
1) Quando effettuo il login sul portale, sul monitor di mysql le connessioni sono a 7.
2) Se lancio il primo caricamento vado a 90
3) Se lancio il secondo caricamento vado oltre i 100 di default.
Ho anche analizzato il codice inserendo i close e i dispose laddove servivano, e a fine procedura chiudo la connessione con tanto di dispose.
Mi chiedo, possibile che le connessioni salgono a 90 se apro solo 4 datareader e li chiudo correttamente?
La cosa mi sembra molto strana...
0v3rCl0ck
Profilo
| Guru
1.120
messaggi | Data Invio:
dom 19 gen 2014 - 21:33
Fai le prove che ti ho elencato nel post precedente, perché con la SqlConnection, la risposta la conosco, ed è no, non è possibile che ti sia problemi di quel genere se fai la dispose della connessione, ma la connection pool di MySql connector sembra essere particolarmente diversa.
Prova ad utilizzare sempre il SqlHelper come suggeriscono da loro documentazione, senza mai avere il riferimento della connessione e lasciala gestire al connector.
Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic
Torna su
Stanze Forum
Elenco Threads
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 !