2009-12-01 19 views

Respuesta

6

Yo diría que no comparta el objeto de conexión, solo cree una nueva conexión y permita que ADO.net maneje la agrupación de conexiones.

+0

Tiendo a estar de acuerdo, el servidor de base de datos está diseñado para administrar la agrupación de conexiones, lo mejor es dejar que el servidor de bases de datos diseñado para hacer –

10

Generalmente las conexiones no son seguras para subprocesos (SqlConnection, MySqlConnection y OracleConnection mencionan específicamente que no son seguras para subprocesos).

No comparta una conexión entre hilos.

0

No hay código de muestra en la naturaleza porque (casi) nadie lo hace porque es una idea muy, muy mala.

3

para responder a los parámetros actuales de la cuestión, en lugar de despedirlos, me envuelva el DbCommand para ayudar a sincronizar el acceso a la conexión (si y sólo si que sea absolutamente necesario).

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); 
    } 
} 

Para utilizar el ejemplo, usted tiene que crear una instancia con una real DbCommand, así como alguna instancia de objeto que se comparte entre todos los usos de una conexión. En el uso más simple, incluso podría pasar el objeto de conexión como el objeto de bloqueo. La instanciación debería ocurrir en una declaración using. Esto no le impide saber exactamente cuáles son sus requisitos de uso y cómo funciona la clase Monitor y el bloqueo.

De una forma u otra, desea sincronizar el uso de la conexión entre subprocesos, y lo anterior es un enfoque para hacerlo.

+1

Absolutamente NO HAGA esto, no hay una buena razón para hacerlo y afectará el rendimiento de su aplicación. Use la agrupación de conexiones como los estados de respuesta anteriores. –

+1

"No hay una buena razón"? Sin conocer la arquitectura de su código, ¿cómo puedes reclamar eso? En cuanto a compartir una conexión, es un método bien conocido para habilitar transacciones sin promocionar a MSDTC. Este es un gran beneficio de rendimiento. Sin embargo, comenzando desde cero, por supuesto, no aconsejaría el enfoque descrito en mi respuesta. Pero en * respeto al que pregunta y respondiendo a los detalles de su pregunta *, esta es mi recomendación. –

+0

Todavía esperando ser iluminado ... –

Cuestiones relacionadas