2010-03-26 6 views
10

Hi I genera classi Dao per alcune operazioni DBUtilizzo di metodi statici o nessuno metodo statico nella classe Dao?

in questo modo rendendo i metodi di classe Dao come statici o nessuno statico è migliore?

Utilizzando la classe di esempio di esempio di seguito, İf più di un client ha potuto utilizzare il metodo AddSampleItem nello stesso tempo?

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

risposta

9

Sarebbe un gran casino. Se si aggiungono 2 elementi contemporaneamente da diversi thread, si otterranno risultati molto strani o addirittura errori se uno thread chiude DataAcessor prima che l'altro completi.

Vorrei utilizzare un locale DataAcessor o crearne uno nuovo e utilizzarlo in tutti i metodi a seconda di come si desidera gestire la durata di DataAcessor.

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

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

questo codice non è thread-safe nel modo in cui lo avete scritto.

se si dispone del campo dataAccessor e dei metodi statici come questo, si avranno problemi di concorrenza con più client che colpiscono questo codice allo stesso tempo. è probabile che si verifichino eccezioni molto strane e persino che un cliente possa vedere i dati di un altro cliente.

sbarazzarsi di statico su questi metodi e questo campo e istanziare una nuova istanza di SampleDao per ogni cliente.

0

Assegnazione di nuovo oggetto DataAccessor di riferimento DataAccessor statica in ogni metodo si tradurrà in problemi di concorrenza. È ancora possibile avere i metodi statici in classe SampleDao, ma assicurarsi di rimuovere il riferimento statico a DataAccessor. Per utilizzare DataAccessor, creare un'istanza locale. In questo modo puoi evitare problemi di concorrenza. Lo svantaggio qui è ogni volta che si chiama il metodo statico, viene creata un'istanza a DataAccessor.

Nella maggior parte dei casi, i Daos sono apolidi. In questi casi non vedo alcun punto di avere metodi non statici in Daos, perché è necessario creare un'istanza di quel dao per accedere al suo metodo.

0

Bruno è corretto. Tuttavia, potresti anche aggiungere un singleton e utilizzare "lock" per il single-thread di quella parte della tua app. Tieni presente, tuttavia, che le richieste stanno per accodarsi e se la tua query richiede del tempo, le prestazioni della tua app si ridurranno. Ciò è particolarmente evidente in un'app Web. Per un app mobile o desktop il "blocco" è decisamente appropriato.

Problemi correlati