2009-12-01 12 views

risposta

6

Direi che non condividere l'oggetto di connessione stesso, basta creare una nuova connessione e lasciare ADO.net gestire il pool di connessioni.

+0

Tendo ad essere d'accordo, il server di database è progettato per gestire il pool di connessioni, è meglio lasciare al server DB quello che era progettato per fare. –

10

In genere le connessioni non sono thread-safe (SqlConnection, MySqlConnection e OracleConnection indicano in modo specifico che non sono thread-safe).

Non condividere una connessione tra thread.

0

Non c'è alcun codice di esempio in circolazione perché (quasi) nessuno lo fa perché è un'idea molto, molto, pessima.

3

per rispondere ai parametri attuali della questione, piuttosto che licenziare, vorrei avvolgere il DbCommand per aiutare sincronizzare l'accesso alla connessione (se e solo se è assolutamente necessario).

public class SyncedDbCommand : DbCommand 
{ 
    private DbCommand _cmd; 
    private object _sync; 

    public SyncedDbCommand(DbCommand cmd, object sync) 
    { 
     _cmd = cmd; 
     _sync = sync; 
    } 

    // omitted basic proxy method overrides 

    protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) 
    { 
     Monitor.Enter(_sync); 
     return _cmd.ExecuteReader(); 
    } 

    public override int ExecuteNonQuery() 
    { 
     Monitor.Enter(_sync); 
     return _cmd.ExecuteNonQuery(); 
    } 

    public override object ExecuteScalar() 
    { 
     Monitor.Enter(_sync); 
     return _cmd.ExecuteScalar(); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      Monitor.Exit(_sync); 
     } 
     base.Dispose(disposing); 
    } 
} 

Per utilizzare l'esempio, bisogna istanziare con un vero e proprio DbCommandcosì come qualche caso oggetto che viene condiviso tra tutti gli usi di una connessione. Nell'uso più semplice, si potrebbe persino passare l'oggetto di connessione stesso come oggetto di blocco. L'istanziazione dovrebbe verificarsi in un'istruzione using. Questo non ti assolve dal sapere esattamente quali sono i tuoi requisiti di utilizzo e come funzionano la classe Monitor e il blocco.

In un modo o nell'altro, si desidera sincronizzare l'utilizzo della connessione tra thread e quanto sopra è un approccio per farlo.

+1

Assolutamente NON farlo, non ci sono buoni motivi per farlo e influirà sulle prestazioni della tua applicazione. Utilizzare il pool di connessioni come gli stati di risposta sopra. –

+1

"Nessun buon motivo"? Senza conoscere l'architettura del suo codice come puoi affermarlo? Per quanto riguarda la condivisione di una connessione, è un metodo ben noto per abilitare le transazioni senza promuovere a MSDTC. Questo è un enorme vantaggio in termini di prestazioni. Tuttavia, partendo da zero, ovviamente non consiglierei l'approccio descritto nella mia risposta. Ma nel * rispettare il richiedente e rispondere ai particolari della sua domanda *, questa è la mia raccomandazione. –

+0

Ancora in attesa di essere illuminato ... –

Problemi correlati