2011-02-25 11 views
5

na podstawie tego przykładu:Wiosna: @PersistenceContext i @Autowired bezpieczeństwo wątku?

@Service 
public class Purchase { 
    @PersistenceContext 
    private EntityManager em; 

    @Autowired 
    private PurchaseDAO dao; 

    private String normalField; 

    .... // methods, operations, etc 
} 

Proszę pomóc mnie poprawić, jeśli im pomylić:

  1. Klasa serwis Zakup i PurchaseDAO są samotnymi, które są zarządzane przez sprężynę
  2. Pole klasy usługi normalField nie jest chronione wątkami, ponieważ singleton jest pojedynczym obiektem udostępnianym przez wiele różnych użytkowników.
  3. Załóżmy, że @ Repository-adnotacją-PurchaseDAO robi żadnego pola, co oznacza, że ​​to threadsafe zostanie wstrzyknięty automatycznie przez sprężynę
  4. EntityManager instancja jest także właściwość threadsafe ponieważ @PersistenceContext uczyni upewnij się, że zostanie użyty element entityManager bieżącej transakcji.

Dziękujemy!

+0

hej @bertie, używam podejścia '@ PersistenceContext'. ale wydaje się, że tworzy wyciek pamięci. ponieważ sesja nie jest jasna. Czy doświadczyłeś czegoś takiego? – oak

+0

@oak: Przepraszam, nie jestem pewien, ponieważ minęło sporo czasu od kiedy ostatnio grałem z JPA. Proponuję Ci utworzyć nowe pytanie do twojego problemu wraz ze środowiskiem, w którym umieścisz '@ PersistenceContext', itp. – bertie

Odpowiedz

7
  1. Domyślnie są one singletons (gdy są zarządzane Spring), chyba że zostały skonfigurowane inaczej (z konfiguracji xml lub z adnotacjami można ustawić za pomocą @Scope).
  2. Tak i nie. Tak, nie jest to bezpieczne w tym sensie, że wiele wątków może uzyskać do nich dostęp i modyfikować je jednocześnie, i nie, ponieważ zależy to od typu danych, a ciąg jest niezmienny (i przynajmniej mówi się, że jest bezpieczny dla wątków). Mogłoby to wybuchnąć, gdyby dwa różne wątki próbowały zapisać nowy ciąg w zmiennej członkowskiej dokładnie w tym samym momencie.
  3. Tak i nie ponownie. Jeśli DAO nie ma wewnętrznego stanu, tak, powiedziałbym, że jest bezpieczny dla wątków, ale obiekty, które obsługuje, mogą nie być (chociaż jeśli używasz jednostek JPA, powinny być).
  4. Przynajmniej dokumentacja Hibernate mówi, że EntityManagers nie są wątkowo bezpieczne, ale przy korzystaniu z EntityManager wstrzykniętego przez Spring, nie powinno to stanowić problemu.

SpringSource forums: Szukałem odpowiedzi na to samo pytanie na forum ... Generał concensus wydaje się, że podczas gdy EntityManager nie jest bezpieczeństwo wątków za widowisko WZP, EntityManager wstrzykuje do wiosny poprzez EntityManager proxy może być.

Hibernate: EntityManager jest tanie, nie threadsafe przedmiotów, które powinny być używane tylko raz, dla jednego procesu przemysłowego, pojedyncza jednostka pracy, a następnie odrzucono. EntityManager nie uzyska połączenia JDBC (lub źródła danych), chyba że jest to potrzebne, więc możesz bezpiecznie otwierać i zamykać EntityManager, nawet jeśli nie masz pewności, że dostęp do danych będzie wymagany do obsługi określonego żądania.

+0

2.Czy posiadanie nie-końcowej właściwości klasy zawsze powoduje, że klasa nie jest wątkowo bezpieczna? Mam na myśli, że pomimo tego, że typ właściwości (String) jest niezmienny, właściwość można nadal zmienić, aby wskazywała na inny obiekt (inną instancję klasy String). Czy to nie powoduje, że klasa nie jest całkowicie bezpieczna dla wątków? –

+0

To prawda, choć zależy to od tego, w jaki sposób zmienna członkowska (właściwość klasy) jest dostępna, modyfikowana i używana, ale ogólnie rzecz biorąc, powiedziałbym, że istnieje możliwość, że ta sama zmienna może być modyfikowana z dwóch różnych wątków jednocześnie lub z dostępem do niej. przez jedną, podczas gdy jest modyfikowana przez inną, to sprawi, że klasa nie będzie bezpieczna dla wątków. Z synchronizacją lub jeśli zmienna jest tylko odczytana (lub w tym przypadku, odniesienie do String lub cały ciąg może zostać skopiowany do innego odniesienia poza klasą przed użyciem), jednoczesny dostęp nie powinien powodować żadnych problemów, a zatem klasa powinna być Wątek bezpieczny. – esaj

Powiązane problemy