webForumDet fria alternativet

Stänga databaskopplingar i ADO.net?

.NET

8 svar · 456 visningar · startad av Lukaspojken

Medlem sedan maj 20011 312 inlägg
Frågan#1

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?

Medlem sedan dec. 19996 522 inlägg
#2

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.

Info om close vs dispose
http://codebetter.com/blogs/sahil.malik/archive/2004/12/31/40036.aspx

Medlem sedan maj 20011 312 inlägg
#3

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!

Medlem sedan dec. 19996 522 inlägg
#4

kör du using kanske?

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.

Medlem sedan maj 20011 312 inlägg
#5

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.

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?

Jag hittade dock ett annat ställe där man fyller ett dataset och efter denna fyllning så stänger man inte kopplingen.

Medlem sedan maj 20012 812 inlägg
#6

lukaspojken skrev:

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

- M

Medlem sedan feb. 2005280 inlägg
#7

Gladh skrev:

lukaspojken skrev:

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...
- 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();
Medlem sedan dec. 19996 522 inlägg
#8

SqlDataAdapter stänger bara connection så länge den inte redan var öppen när du anropar Fill. QuietOpen and QuietClose på DataAdaptern.

Medlem sedan feb. 2005280 inlägg
#9

erka skrev:

SqlDataAdapter stänger bara connection så länge den inte redan var öppen när du anropar Fill. QuietOpen and QuietClose på DataAdaptern.

Ja precis det var ju det som var poängen som jag skrev ovan, inte behöva öppna - inte behöva stänga

254 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)