2010-03-26 14 views
10

Hola, genero clases de Dao para algunas operaciones DB¿Usando métodos estáticos o ninguno estático en Dao Class?

de esta manera, haciendo que los métodos de la clase Dao sean estáticos o ninguno sean estáticos es mejor?

Utilizando la clase de ejemplo de dao a continuación, ¿más de un cliente llegó a utilizar el método AddSampleItem al mismo tiempo? ¿Cómo puede resultar esto?

public class SampleDao 
{ 
    static DataAcessor dataAcessor 

    public static void AddSampleItem(object[] params) 
    { 
     dataAcessor =new DataAcessor(); 
     //generate query here 
     string query="..." 
     dataAcessor.ExecuteQery(query); 
     dataAcessor.Close(); 
    } 

    public static void UpdateSampleItem(object[] params) 
    { 
     dataAcessor =new DataAcessor(); 
     //generate query here 
     string query="..." 
     dataAcessor.ExecuteQery(query); 
     dataAcessor.Close(); 
    } 
} 

Respuesta

9

Causaría un gran desorden. Si está agregando 2 elementos simultáneamente de diferentes hilos, seguramente terminará con resultados muy extraños, o incluso errores si un hilo cierra el DataAcessor antes de que el otro finalice.

Usaría un DataAcessor local o crearé uno nuevo y lo usaría en todos los métodos, dependiendo de cómo quiera administrar la vida útil de DataAcessor.

public class SampleDao 
{ 
    public void AddSampleItem(object[] params) 
    { 
     DataAcessor dataAcessor =new DataAcessor(); 
     // ... 
    } 

    public void UpdateSampleItem(object[] params) 
    { 
     DataAcessor dataAcessor =new DataAcessor(); 
     // ... 
    } 
} 
2

este código no es seguro para subprocesos de la forma en que lo tiene escrito.

si tiene el campo dataAccessor y los métodos estánticos como este, tendrá problemas de concurrencia con varios clientes que pegan este código al mismo tiempo. es probable que ocurran excepciones muy extrañas, e incluso posible que un cliente pueda ver los datos de otro cliente.

Deshágase de la estática de estos métodos y este campo y cree una instancia nueva de SampleDao para cada cliente.

0

Asignación nuevo objeto DataAccessor de referencia DataAccessor estática en cada método dará lugar a problemas de concurrencia. Aún puede tener los métodos estáticos en la clase SampleDao, pero asegúrese de eliminar la referencia estática a DataAccessor. Para usar DataAccessor, crea una instancia local. De esta forma puede evitar problemas de concurrencia. La desventaja aquí es que cada vez que llamas al método estático, se crea una instancia para DataAccessor.

Daos en la mayoría de los casos son sin estado. En esos casos no veo sentido en tener métodos no estáticos en Daos, porque necesitamos crear una instancia de ese dao para acceder a su método.

0

Bruno es correcto. Sin embargo, también puede agregar un singleton y usar "bloqueo" para unir solo esa parte de su aplicación. Tenga en cuenta, sin embargo, que las solicitudes se van a poner en cola y si su consulta lleva tiempo, el rendimiento de su aplicación se degradará. Esto es especialmente notable en una aplicación web. Para una aplicación móvil o de escritorio, el "bloqueo" es definitivamente apropiado.

Cuestiones relacionadas