Mijn ASP.NET pagina maakt een connectie met de database, maar op een of andere manier blijven mijn connecties open staan. Heel vreemd, omdat ik netjes Close() aanroep en zelfs (nog beter) de connectie in een using ( ... ) { ... } blok heb gezet. Ik gebruik een System.Data.SqlClient.SqlCommand object die ik een scalar laat teruggeven middels ExecuteScalar. In de Help zie ik ook nergens terug dat ik mijn SqlCommand moet opruimen en using blok hieromheen zetten heeft geen effect.
Precies bij het voor de 101ste keer openen van een connectie krijg ik de volgende foutmelding:
Aangezien er standaard 100 connecties in de .NET connectionpool zitten kan ik concluderen dat geen enkele connectie wordt gesloten. Hieronder een stuk voorbeeldcode waarin het fout gaat. Ik maak gebruik van de Northwind database van MS SQL Server. De RecordCount() functie opent en sluit een connectie. Dit is het stuk code waarin het dus fout gaat. Daarnaast is de Page_Load() functie gegeven voor het testen. Deze voert de RecordCount net zolang uit, totdat geen connectie meer geopend kan worden (en dit is bij mij dus bij connectie nr. 101).
Wat-o-wat doe ik fout?
Precies bij het voor de 101ste keer openen van een connectie krijg ik de volgende foutmelding:
| Time-out is verstreken. De time-outperiode is verstreken voordat een verbinding werd verkregen uit de groep. Een mogelijke oorzaak is dat alle verbindingen in de groep in gebruik waren en de maximale groepsgrootte werd bereikt. |
Aangezien er standaard 100 connecties in de .NET connectionpool zitten kan ik concluderen dat geen enkele connectie wordt gesloten. Hieronder een stuk voorbeeldcode waarin het fout gaat. Ik maak gebruik van de Northwind database van MS SQL Server. De RecordCount() functie opent en sluit een connectie. Dit is het stuk code waarin het dus fout gaat. Daarnaast is de Page_Load() functie gegeven voor het testen. Deze voert de RecordCount net zolang uit, totdat geen connectie meer geopend kan worden (en dit is bij mij dus bij connectie nr. 101).
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| protected HtmlForm Form1; private void RecordCount() { string cmdText = "SELECT COUNT(*) AS C FROM Customers"; string connString = "server=(local);User ID=sa;Pwd=;database=Northwind"; using ( SqlConnection conn = new SqlConnection(connString) ) { conn.Open(); SqlCommand cmd = new SqlCommand(cmdText, conn); int me = (int)cmd.ExecuteScalar(); } // using ends so conn.Dispose is called and connection is closed. } private void Page_Load(object sender, System.EventArgs e) { int connCounter = 0; // counts the succesfully opened connections bool error = false; // indicates if there is an error during opening string errorMessage = ""; // the possible error message // Count how many times we can Open a connection while ( error == false && connCounter < 1000 ) { try { RecordCount(); connCounter++; } catch ( Exception ex ) { // save error message and break from while errorMessage = ex.Message; error = true; } } // Show the result on the Clients browser Label myLabel = new Label(); if ( error ) { myLabel.Text = "Error while opening connection " + (connCounter+1).ToString() + ".<br>" + errorMessage; } else { myLabel.Text = "Successfully opened a 1000 connections."; } this.Form1.Controls.Add( myLabel ); } |
Wat-o-wat doe ik fout?