2010-03-26 13 views
10

Salut, je génère des classes Dao pour certaines opérations de base de donnéesUtilisation de méthodes statiques ou de méthodes statiques dans la classe Dao?

De cette manière, rendre les méthodes de classe Dao statiques ou statiques est-il préférable? En utilisant l'exemple de classe dao ci-dessous, İf plus d'un client a-t-il utilisé la méthode AddSampleItem en même temps?

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

Répondre

9

Il en résulterait un gros désordre. Si vous ajoutez deux éléments simultanément à partir de différents threads, vous obtiendrez des résultats très étranges, voire des erreurs si un thread ferme le DataAcessor avant que l'autre ne soit terminé.

Je voudrais utiliser un DataAcessor local ou en créer un nouveau et l'utiliser dans toutes les méthodes en fonction de la façon dont vous voulez gérer la vie de DataAcessor.

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

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

Ce code n'est pas sûr pour les threads comme vous l'avez écrit.

Si vous avez le champ dataAccessor et les méthodes statiques comme ceci, vous aurez des problèmes de simultanéité avec plusieurs clients qui frappent ce code en même temps. Il est probable que vous ayez des exceptions très étranges et même qu'un client puisse voir les données d'un autre client.

se débarrasser de statique sur ces méthodes et ce champ et instancier une nouvelle instance de SampleDao pour chaque client.

0

Affectation nouvel objet DataAccessor à la référence DataAccessor statique dans chaque méthode se traduira par des problèmes de concurrence. Vous pouvez toujours avoir les méthodes statiques dans la classe SampleDao, mais assurez-vous de supprimer la référence statique à DataAccessor. Pour utiliser DataAccessor, créez une instance locale. De cette façon, vous pouvez éviter les problèmes de concurrence. L'inconvénient ici est chaque fois que vous appelez la méthode statique, une instance à DataAccessor est créée. Dans la plupart des cas, les Daos sont sans état. Dans ces cas, je ne vois pas l'utilité d'avoir des méthodes non statiques dans Daos, car nous devons créer une instance de ce dao pour accéder à sa méthode.

0

Bruno a raison. Cependant, vous pouvez également ajouter un singleton et utiliser "lock" pour faire un seul thread de cette partie de votre application. Gardez à l'esprit, cependant, que les requêtes vont se mettre en file d'attente et si votre requête prend du temps, les performances de votre application se dégraderont. Ceci est particulièrement visible dans une application Web. Pour une application mobile ou de bureau, le "verrou" est définitivement approprié.