2010-03-26 7 views
10

Witam Generuję klasy Dao dla niektórych operacji DBKorzystanie z metod statycznych lub bez metod statycznych w klasie Dao?

w ten sposób, aby metody klasy Dao były statyczne lub żadne statyczne nie są lepsze?

Używając przykładowej klasy dao poniżej, İf więcej niż jeden klient musiał użyć metody AddSampleItem w tym samym czasie? W jaki sposób może to spowodować?

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

Odpowiedz

9

Spowodowałoby to duży bałagan. Jeśli dodasz 2 przedmioty jednocześnie z różnych wątków, na pewno skończysz z bardzo dziwnymi wynikami, a nawet błędami, jeśli jeden wątek zamknie DataAcessor przed zakończeniem drugiego.

Chciałbym użyć lokalnego DataAcessor lub utworzyć nowy i używać go we wszystkich metodach, w zależności od tego, jak chcesz zarządzać życiem DataAcessor.

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

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

ten kod nie jest bezpieczny dla wątków w taki sposób, w jaki został napisany.

Jeśli masz pole dataAccessor i metody statyczne takie jak to, będziesz mieć problemy z współbieżnością z wieloma klientami, którzy będą trafiać ten kod w tym samym czasie. Prawdopodobnie wystąpią bardzo dziwne wyjątki, a nawet, że jeden klient może zobaczyć dane innego klienta.

pozbyć się statycznych na tych metodach i tego pola i utworzyć instancję nowej instancji SampleDao dla każdego klienta.

0

Przypisanie nowego DataAccessor obiekt do statycznej odniesienia DataAccessor w każdej metody spowoduje problemów współbieżności. Nadal możesz mieć statyczne metody w klasie SampleDao, ale upewnij się, że usuniesz statyczne odniesienie do DataAccessor. Aby użyć DataAccessor, utwórz lokalną instancję. W ten sposób unikniesz problemów związanych z współbieżnością. Wadą jest to, że za każdym razem, gdy wywoływana jest metoda statyczna, tworzone jest wystąpienie do DataAccessor.

Daos w większości przypadków są bezpaństwowcami. W tych przypadkach nie widzę sensu w posiadaniu niestatycznych metod w Daos, ponieważ musimy stworzyć instancję tego dao, aby uzyskać dostęp do jej metody.

0

Bruno ma rację. Możesz jednak dodać singleton i użyć "blokady" do pojedynczego wątku tej części aplikacji. Pamiętaj jednak, że żądania będą w kolejce, a jeśli zapytanie zajmie trochę czasu, wydajność Twojej aplikacji ulegnie pogorszeniu. Jest to szczególnie widoczne w aplikacji internetowej. W przypadku aplikacji mobilnej lub komputerowej "blokada" jest zdecydowanie odpowiednia.