Pool di connessioni massimo limitato a 100


27

Sto eseguendo SQL Server 2008 R2 SP1, su una scatola di Windows Server 2008. Ho uno script .NET in esecuzione da Visual Studio 2010 che esegue le seguenti operazioni:

  • Raggiunge nel database
  • Fa un cambiamento
  • itera

Il numero totale di volte che ripeterà è 150, tuttavia si ferma a 100 connessioni e non riesco a capire perché. Potrei adattare il mio script per usare solo un singolo thread, ma preferirei sapere dove mi manca un'impostazione di connessione massima in quanto sarebbe più utile sapere per riferimento futuro.

Ecco dove ho controllato finora:

  • Stringa di connessione SQL in Visual Studio 2010 (è impostata su 1000)
  • Proprietà di connessione all'istanza del database SSMS (è impostata su 0 [infinito] connessioni utente)
  • Cerca su Google alcune informazioni su Server 2008, sembra che possa gestire più di 100 connessioni
  • Ho esaminato il mio codice a fianco del SP_WHO2quale fornisce ulteriori informazioni sulle connessioni logiche, visto che il numero di connessioni inizia da 52 e gli errori di script con l'errore "Max Pooled Connections raggiunto" con 152 connessioni logiche.
  • Modificata la stringa di connessione da utilizzare Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000

Non sono sicuro di dove altro controllare, so di avere un sacco di parti mobili qui, ma ho la sensazione che mi sto perdendo un'impostazione massima della piscina da qualche parte.


1
Puoi pubblicare la tua stringa di connessione? Si prega di vedere la mia risposta. Questo dovrebbe essere il tuo rimedio (questo valore verrà specificato nella stringa di connessione. Il System.Data.SqlClientvalore predefinito è 100, motivo per cui viene visualizzato l'esaurimento del pool di connessioni).
Thomas Stringer

Risposte:


24

SQL Server consente un massimo di 32767 connessioni per impostazione predefinita. Può essere modificato usando sp_configure. Per visualizzare la configurazione corrente per questa impostazione, utilizzare la seguente query:

select * from sys.configurations
where name ='user connections'

Per impostazione predefinita, dovresti vedere un massimo di 32767, value_in_useuguale a 0 (usa le impostazioni predefinite). Se questo è stato modificato, è possibile riconfigurare SQL Server per utilizzare altri valori come descritto nel collegamento.

Dovresti anche verificare quante connessioni vengono effettivamente effettuate, poiché potrebbe esserci più attività all'esterno dell'applicazione (o l'applicazione sta effettuando più connessioni di quanto pensi). Dovrai guardare Statistiche generali -> Connessioni logiche in perfmon o interrogare i valori in sys.dm_os_performance_counters(cntr_value mostrerà il punto corrente nel valore temporale):

select * from sys.dm_os_performance_counters
where counter_name ='User Connections'

Sì, ho già controllato le connessioni utente (è la prima cosa a cui sono andato ed è la più semplice da trovare sia nell'interfaccia utente che nella documentazione di Microsoft. Ho anche esaminato il mio codice e tenuto d'occhio il numero di connessioni logiche tramite SSMS da usando SP_WHO2, che fornisce una discreta quantità di informazioni sulle connessioni logiche. Inattivo, il mio server ha 51 connessioni. Quando lo script fallisce, ha creato altre 100 connessioni. Ecco come sono arrivato a dove sono ora.
Sean Long

Ho chiarito un po 'di più la mia domanda con i passi che ho preso. Potrebbe non essere affatto un'impostazione in SQL, motivo per cui ho iniziato a guardare le impostazioni di Windows e Visual Studio.
Sean Long,

1
Se hai verificato tutto ciò e non riesce ancora a 100 connessioni, la risposta si trova al di fuori delle impostazioni del database. Cordiali saluti, quelle 51 connessioni sono tutti i processi di sistema (+1 per te).
Mike Fal,

Solo per fornire un po 'di chiusura, quell'ultimo commento ha finito per essere corretto. Ho esaminato più da vicino il motivo per cui quelle 100 connessioni venivano create e ho trovato una perdita nel codice. Dopo aver risolto che funziona bene. Le informazioni di cui sopra sono comunque ancora molto utili e spero che anche altri lo troveranno utile.
Sean Long,

25

Nella stringa di connessione, specifica max pool size=<your desired max pool size>. Quindi, in altre parole, se si desidera modificare la dimensione massima del pool sul valore 500, la stringa di connessione potrebbe essere simile a questa:

"data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500"

Ovviamente sto assumendo così tanto con i tuoi altri parametri, ma questo dovrebbe darti una buona idea su come procedere. Il pool di connessioni è l'applicazione del provider lato client. È il client che dovrà specificare questa impostazione di dimensione massima del pool, tramite la stringa di connessione.

Inoltre, assicurarsi di chiudere o smaltire correttamente le connessioni, altrimenti si collegheranno le connessioni. Qualcosa del genere (C #):

string connectionString = "data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500";

using (SqlConnection dbConn = new SqlConnection(connectionString))
{
    using (SqlCommand sqlCmd = new SqlCommand())
    {
        sqlCmd.Connection = dbConn;
        sqlCmd.CommandText = "select 1;";

        // ... so on and so forth
    }
}

Il usingblocco (in C #) chiama IDisposable.Dispose()al completamento. Potresti anche implementare SqlConnection.Dispose()o SqlConnection.Close()nel finallyblocco di un try/catch/finallyblocco.

Riferimento: documentazione MSDN sulla proprietà SqlConnection.ConnectionString


Ecco la stringa di connessione, aggiornando anche la mia domanda. Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
Sean Long,

3
È la tua stringa di connessione ovunque ? Il motivo per cui lo chiedo è perché stringhe di connessione diverse saranno pool di connessione diversi.
Thomas Stringer

Questa è un'ottima domanda. Finora ho controllato 3 stringhe di connessione, ma tutte spingono per un pool max. Vedrò se riesco a trovare un'altra stringa che potrebbe causarla.
Sean Long,

Se esegui solo il debug dell'esecuzione, dovresti essere in grado di vedere qual è il valore di runtime SqlConnection.ConnectionStringper l'operazione specifica. Sarebbe il modo più semplice. Se max pool sizenon c'è, allora è 100.
Thomas Stringer

1
Questo dovrebbe essere contrassegnato come risposta accettata in quanto risponde effettivamente al PO correttamente. Indica sia il parametro Max Pool Size del client che la stringa di connessione e la necessità di chiudere / eliminare le connessioni.
Adam Caviness,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.