Bakgrund : En WinForm-applikation (ingen multithreading) med följande i connectionsträngen : Hmm...tror jag kom på svaret själv. Det är väl 5 st per "unik" connectionsträng? Jag fortsätter väl min monolog här :-) Det blir minst 1 och max 5 st connections PER KLIENT. Varje klient har ju sin egen connection pool i COM+ på den lokala datorn. Eftersom det är en Win-Forms appl. Grejen är att jag använder c#:s using-konstruktor överallt och den skall ju garantera att Dispose(och därmed Close) anropas. Iofs finns det en teoretisk chans att jag missat det på något ställe så jag får väl leta lite.Connection pooling
<info>
connection timeout=30;Min Pool Size = 1; Max Pool Size=5;
</info>
Har jag då max 5 anslutningar PER KLIENT eller 5 anslutningar för samtliga användare?
Dvs om jag har 20 personer som jobbar mot min databas samtidigt, delar alla dessa 20 då på 5 anslutningar, eller har de 5 var (100 st totalt)?
Vidare, enligt förutsättningarna ovan plus det faktum att datalagret är skrivet så att anslutningarna hålls öppna så kort tid som möjligt, vad är lämpliga inställningar för denna applikation? Connection pooling eller ej? Min, max pool size?
Jag har nämligen helt nyligen börjat få in följande fel från mina kunder :
<info>
An exception of type 'System.InvalidOperationException' occured!
Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
</info>Sv: Connection pooling
Sv:Connection pooling
Läste nyss att "integrated security=true" dvs Windows NT Authentication gör att connection poolingen sätts ur spel (trots att Connectionsträngen är densamma för alla användare). Bör man alltså undvika NT Authentication och bara tillåta inloggning med ett SQL-Server konto?Sv: Connection pooling
Problemet är dock ett annat skulle jag tro. Troligen glömmer du på minst ett ställe i applikationen att stänga datareader/connection efter dig och därför får du connections som ligger och skräpar och ganska snabbt kommer poolen att bli full. Jag skulle rekommendera att du:
1. Gå igenom alla anrop till databasen - och säkerställ att du stänger connection efter dig.. (Close() = återlämna till poolen!)
2. I testmiljö, sätt min OCH max poolsize till 1! testa igenom allt metodiskt.. noter när det smäller - du har i FÖREGÅENDE databasanrop med stor sannolikhet missat dr.Close()/cn.Close().
3. I ditt datalager.. wrappa connection.Open() med Try/Catch. Om en poolad connection inte kunde skapas (Exception) .. skapa en connection utan connection pooling. (Pooling = False).
(eventuellt.. logga när detta inträffar så du kan analysera varför det händer..) Sv:Connection pooling