2013-02-15 12 views
5

che sto vivendo errori casuali (diversi per giorno) nel mio MVC + ef + applicazione unità sotto carico elevato (10+ richiesta per sec):errori casuali si verificano con per-richiesta DbContext

  • Il collegamento non è stato chiuso/stato corrente del collegamento è il collegamento
  • deadlock su query Count (senza transazione esplicita)
  • è già stato aggiunto un elemento con la stessa chiave. in System.Data.Entity.DbContext.SetTEntity durante la risoluzione di DbContext
  • L'host remoto ha chiuso la connessione. Il codice di errore è 0x80070057
  • C'è già un DataReader aperto associato a questo comando che deve essere chiuso per primo. - Ho attivato MARS per sbarazzarsi di questo (anche se credo che funzioni correttamente senza MARS, non ci sono query annidate), che potrebbe causare un altro errore casuale:
  • Il server interromperà la connessione, perché il client il driver ha inviato più richieste mentre la sessione è in modalità utente singolo.

io uso this attuazione PerRequestLifetimeManager e provato Unity.Mvc3 anche senza alcuna differenza.

Ci sono somehints che DbContext non viene smaltito correttamente. Non sono sicuro se per-richiesta è la causa di problemi, perché sembra essere la pratica common.

+0

si fa a utilizzare più threading da qualche parte? –

+0

no multithreading – polybios

risposta

3

Dopo ulteriori indagini, ho scoperto che il thread di elaborazione richieste talvolta ruba DbContext da un altro thread, quindi l'implementazione di Rashid di PerRequestLifetimeManager potrebbe non essere thread-safe. Mi sono trasferito nuovamente a Unity.Mvc3 e gli errori sono scomparsi, devo aver fatto qualche errore quando l'ho provato l'ultima volta.

L'unico errore non correlato erano deadlock. Essi sono stati causati dalla collisione di

SELECT ... FROM X JOIN Y ... JOIN Z ... 

e

BEGIN TRAN 
UPDATE Z ... 
UPDATE Y ... 
COMMIT TRAN 

SELEZIONA bloccato Y e Z volevano, TRAN bloccato Z e Y voleva

Problemi correlati