Gestione connessioni db

mercoledì 15 settembre 2010 - 11.28
Tag Elenco Tags  C#

Gemini Profilo | Expert

Ciao a tutti
ho un problema con le connessioni al db.
Il database che uso è mysql.
Ho definito una classe DataBanker che si occupa di eseguire tutte le query e di restituire i dati.
Ora apro e chiudo una connessione ogni volta che eseguo una query. Questo va bene se non eseguo molte query contemporaneamente, altrimenti mi da un errore del tipo: "troppe connessioni". Il sito di blocca per qualche secondo e poi ritorna a funzionare.
Come posso evitare questo problema?
Ecco un esempio di query:

public static DataTable Utenti(string status) { string sql = "SELECT * FROM users"; DataTable data = GetDataTable(sql); return data; } private static DataTable GetDataTable(string sql) { OdbcConnection cn = new OdbcConnection(Connection()); cn.Open(); DataTable data = new DataTable(); OdbcDataAdapter adapter = new OdbcDataAdapter(sql, cn); adapter.Fill(data); cn.Close(); cn.Dispose(); return data; }

Grazie

alx_81 Profilo | Guru

>Ciao a tutti
ciao

>Ora apro e chiudo una connessione ogni volta che eseguo una query.
>Questo va bene se non eseguo molte query contemporaneamente,
>altrimenti mi da un errore del tipo: "troppe connessioni". Il
>sito di blocca per qualche secondo e poi ritorna a funzionare.
No, non è corretto. Se apri e chiudi n connessioni, il web server tiene sempre aperto un pool in cui continua a riusare le "stesse" per evitare overhead.
Il fatto che il serve ti vada in "troppe connessioni" è che non le distruggi, e quindi, non potendo riutilizzare il pool, le connessioni disponibili non ci sono

>Come posso evitare questo problema?
cambiando così:

private static DataTable GetDataTable(string sql) { using (OdbcConnection cn = new OdbcConnection(Connection())) { cn.Open(); DataTable data = new DataTable(); using (OdbcDataAdapter adapter = new OdbcDataAdapter(sql, cn)) { try { adapter.Fill(data); } catch (Exception ex) { cn.Close(); cn.Dispose(); } } } return data; }
>Grazie
di nulla!
--
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

Gemini Profilo | Expert

In pratica cosa dovrei fare?

Per esempio, questa come dovrei riscriverla?

string sql = "SELECT * FROM clienti";
OdbcConnection cn = new OdbcConnection(Connection());
cn.Open();
OdbcCommand cmd = new OdbcCommand(sql, cn);
OdbcDataReader dRead = cmd.ExecuteReader();

TipoCliente dati_cliente = new TipoCliente();
if (dRead.HasRows)
{
if (dRead.Read())
{
...
}
}
dRead.Close();
dRead.Dispose();
cn.Close();
cn.Dispose();

return dati_cliente;

Ancora grazie

alx_81 Profilo | Guru

>In pratica cosa dovrei fare?
devi usare la using per gestire close e dispose in automatico
http://msdn.microsoft.com/en-us/library/yh598w02.aspx

e poi la try catch, per fare in modo che se ottieni un'eccezione, la connessione viene chiusa e disallocata, così liberi il pool sul web server per riusare le connessioni ed evitare quell'errore.

>Per esempio, questa come dovrei riscriverla?
la using va messa nella connection e nel command, la try catch va messa nell'executereader, perchè è quella la chiamata che può darti l'errore per cui è necessario gestire la chiusura della connessione forzata.
Se possibile, scarica inoltre il mysql connector for .net () così almeno usi l'oggetto ottimizzato per mysql
http://dev.mysql.com/downloads/connector/net/

--
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

Gemini Profilo | Expert

Ho già scaricato il connector per .net
Devo inserire qualche istruzione particolare per utilizzarlo o mi basta installarlo?
Grazie per l'aiuto

alx_81 Profilo | Guru

>Ho già scaricato il connector per .net
>Devo inserire qualche istruzione particolare per utilizzarlo
>o mi basta installarlo?
devi installarlo e poi lo importi nei riferimenti, aggiungendo anche la using relativa.
--
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

Gemini Profilo | Expert

Scusa se ti disturbo ancora.
Ho fatto come mi hai detto. Ho inserito 'using' nel codice.
Ora ricevo questo errore:
Can't connect to MySQL server on 'localhost' (10048)

Grazie mille

alx_81 Profilo | Guru

>Scusa se ti disturbo ancora.
>Ho fatto come mi hai detto. Ho inserito 'using' nel codice.
>Ora ricevo questo errore:
>Can't connect to MySQL server on 'localhost' (10048)
Questo potrebbe essere un problema di connectionstring o di credenziali.
Prova a confrontare con una di queste:
http://connectionstrings.com/mysql

Per le credenziali, controlla che siano corrette, esattamente come il nome del server. Se sei in locale, se hai un nome server differente, ecc.
--
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

Gemini Profilo | Expert

niente ancora
ho letto che è un problema di windows server 2003.
Per risolvere sto problema bisogna inserire una chiame nel registro di windows
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5