Connessioni a MySQL.

sabato 18 gennaio 2014 - 19.40
Tag Elenco Tags  C#  |  Visual Studio 2010  |  MySQL 5.5

iif Profilo | Expert

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

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

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

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

Ho inserito l'istruzione nel nella connectionstring di web.config, sembra funzioni.
Vi aggiorno in caso di news.
Grazie.

0v3rCl0ck Profilo | Guru

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

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

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
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5