Jag hittade ett ställe i koden där man missat att stänga en datareader och när jag började googla lite på detta. Så fann jag att en del förespråka att man inte bara ska stänga en datareader utan även databaskopplingen. Detta var något nytt för mig. I gammal asp gjorde jag alltid det men i .net trodde jag att connection poolingen skulle ta hand om ens kopplingar, och att det inte var optimalt av den anledningen att stänga kopplingen. Hur är det egentligen med den saken?
Vilket DBMS? Klart du ska stänga din connection (using?), stänger du inte den läcker du ju connections, vilket ligger å tar upp onödig kräm och kan orsaka prestandaproblem.
SQL Server, Oracle och Sybase har det bland annat blivit. Riktigt skumt att vi inte upptäckt detta innan. I och för sig är jag inte helt kunnig i den access-klass som vi tagit fram. Så det kanske sker någon stängning ändå på något sätt. Ska kolla upp det. Tack för länken!
using (SqlConnection cn = new SqlConnection(connectionString))
{
using (SqlCommand cm = new SqlCommand(commandString, cn))
{
cn.Open();
cm.ExecuteNonQuery();
}
}
Kör ju dispose åt dig och dvs close på din connection, kolla i perfcounters efter connectionläckor.
Nix, vi använder inte using men det verkar vara ett bra sätt. Jag såg att det finns stöd using även i VB.net.
Using är bra eftersom den garanterar att din koppling stängs även om något fel i din kod inträffar så att din connection.close() inte skulle anropas, alternativet är att lösa det med try-catch-finally.
lukaspojken skrev:
När jag tittat lite mer i koden så hittade jag faktiskt stängningen: DR = SelectCommand.ExecuteReader(CommandBehavior.CloseConnection)
Men det kanske inte räcker?
Jodå när du stänger din datareader så kommer den stänga ner kopplingen mot databasen också.
lukaspojken skrev:
Jag hittade dock ett annat ställe där man fyller ett dataset och efter denna fyllning så stänger man inte kopplingen.
Det ät inte bra eftersom den kommer hålla din koppling öppen tills den gör en timeout, och skulle kunna leda till att du kommer få slut på dina kopplingar till databasen ditt program kraschar...
lukaspojken skrev:
i .net trodde jag att connection poolingen skulle ta hand om ens kopplingar, och att det inte var optimalt av den anledningen att stänga kopplingen. Hur är det egentligen med den saken?
För att göra ett långt svar kort, så skall du alltid stänga din koppling till databasen så fort som möjligt, och öppna den så sent som möjligt. Om någon säger något annat så är det lögn och åter lögn...
Jag hittade dock ett annat ställe där man fyller ett dataset och efter denna fyllning så stänger man inte kopplingen.
Det ät inte bra eftersom den kommer hålla din koppling öppen tills den gör en timeout, och skulle kunna leda till att du kommer få slut på dina kopplingar till databasen ditt program kraschar...
- M
¨
Använder du SqlDataAdapter så behöver du varken öppna eller stänga ;-)
tex
SqlDataAdapter da = new SqlDataAdapter("select id,name from items", objConn);
DataSet ds = new DataSet();
da.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();