Ho avuto questo SemaphoreFullException per un po 'di tempo.Eccezione di semaforo - L'aggiunta del conteggio specificato al semaforo causerebbe il superamento del conteggio massimo
Per riepilogare .. Ho ospitato un'applicazione su IIS 7.5 con ASP.NET v4.0 framework Pool di applicazioni (integrato). Sto usando l'autenticazione di Windows per autenticare i miei utenti attraverso il dominio (isinrole).
Ho visto tutti gli altri thread su questo argomento, in cui è consigliabile impostare Pooling = False. Non voglio farlo e mi piacerebbe continuare a utilizzare il pool a causa dei vantaggi in termini di prestazioni.
Sto utilizzando Entity Framework 6 per interrogare il database e non sto "eliminando" il dbcontext da nessuna parte nel codice utente. Sembra che il problema sia nel codice DbConnectionPool.
L'errore si verifica in modo casuale in un determinato momento. Non importa se l'applicazione viene utilizzata o meno. A volte, a causa di questo problema, devo riavviare IIS perché i nuovi utenti smettono di essere autenticati.
Quello che ho provato finora:
- Controllare se un oggetto di transazione DB è in via di dismissione.
- Verificare se un DBContext (ctx) viene smaltito prematuramente.
- Verificare la build dell'applicazione (32/62 bit). In questo caso, creo l'applicazione in QUALSIASI modalità CPU e il mio server è a 64 bit.
Nota: Nella mia applicazione, ho utilizzato principalmente oggetti linq-to-EF per interrogare il DB.
Exception: System.Threading.SemaphoreFullException
Message: Adding the specified count to the semaphore would cause it to exceed its maximum count.
StackTrace: at System.Threading.Semaphore.Release(Int32 releaseCount)
at System.Data.ProviderBase.DbConnectionPool.CleanupCallback(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.TimerQueueTimer.CallCallback()
at System.Threading.TimerQueueTimer.Fire()
at System.Threading.TimerQueue.FireNextTimers()
Qualsiasi aiuto in questo senso sarà molto apprezzato.
Stiamo vedendo anche questo - hai mai trovato una soluzione? La ricerca di Google non portava da nessuna parte in fretta, a parte una raccomandazione vaga (e non al 100% efficace) per disattivare il pool di connessioni, che non sarebbe scalabile per noi. –
Non ho una soluzione, solo alcune osservazioni. Il DBContext non è stato progettato per essere utilizzato come. DBContext non è thread-safe. Come gestisci l'aspetto del thread del tuo DBContent? Nota Le chiamate IIS possono coinvolgere diversi thread. Non posso enfatizzare abbastanza prendere in considerazione il passaggio a contesti di breve durata. a un minimo 1 per filo. –
Scuse per la risposta tardiva. Abbiamo dovuto passare alle opzioni ADO/Bulk insert/update per velocizzare l'interrogazione e annullare questo errore. –