2016-05-13 31 views
5

Rozpocząłem dyskusję ze współpracownikiem na temat zarządzania współbieżnością w pojedynczych sesjach bean. Z mojego rozumienia, po przeczytaniu Oracle documentation, jeśli nie zostawisz adnotacji @ConcurrencyManagement, domyślnie jest to współbieżność zarządzana przez kontener. W dokumentacji stwierdza następujące około kontenerów zarządzane singleton fasoli sesji:Zarządzanie równoczesnym dostępem w pojedynczej fasoli sesyjnej

The javax.ejb.Lock adnotacji i typ javax.ejb.LockType służą do określenia poziomu dostępu metod biznesowych Singleton lub @ Metody limitu czasu.

i

Jeśli nie @Lock adnotacja jest obecny na singleton klasy, domyślny typ blokady, @Lock (LockType.WRITE), stosuje się do wszystkich metod biznesowych i timeout.

Teraz, jeśli opisywanie fasoli z @ConcurrencyManagement(ConcurrencyManagementType.BEAN), to jesteś odpowiedzialny za zapewnienie, że stan fasoli są synchronizowane na wszystkich klientów korzystających z synchronized słowa kluczowego i innych standardowych funkcji współbieżności Java. W artykule mówi nawet:

programistów, którzy tworzą singletons z fasoli zarządzane współbieżności są dozwolone w użyciu języka programowania Java prymitywów synchronizacji, takich jak synchronizacja i lotny, aby uniknąć błędów podczas jednoczesnego dostępu.

nie widzę nigdzie w rozdziale dotyczącym pojemnika zarządzane współbieżności, prowadząc mnie do przypuszczenia, że ​​jeśli chcesz synchronizować rzeczy samemu, trzeba opisywać klasę z @ConcurrencyManagement(ConcurrencyManagementType.BEAN).

Mój współpracownik skomentował, mówiąc: "Człowieku, zróbcie coś dziwnego", kiedy zobaczył tę adnotację na mojej fasolce, która rozpoczęła tę dyskusję.

Żadna z jego fasoli nie ma adnotacji @ConcurrencyManagement, ale używa słowa kluczowego synchronized w całej klasie. Czy mam rację, mówiąc, że jakakolwiek precyzyjniejsza synchronizacja, której używa, jest bez sensu, ponieważ wszystkie jego metody biznesowe mają domyślną adnotację @Lock(LockType.WRITE)? Oznaczałoby to, że jeśli klient wywoła jedną ze swoich metod, żaden inny klient nie może wywołać żadnej metody komponentu bean, więc jawna synchronizacja w metodzie byłaby bezużyteczna.

Na przykład dla pewnej blokady myLock używanej w synchronized (myLock) w ramach jednej z jego metod biznesowych, nie byłoby rywalizacji o tę blokadę, ponieważ metody te są skutecznie synchronizowane same.

Popraw mnie jeśli się mylę, ale wydaje się, że jego metody zasadzie wyglądać następująco:

public synchronized void myMethod() { 
    // do stuff 
    synchronized (lock) { 
     // modify mutable state 
    } 
} 

public synchronized void myOtherMethod() { 
    // do other stuff 
    synchronized (lock) { 
     // modify mutable state 
    } 
} 

Zakładając, że lock jest tworzony w tej sesji singleton fasoli tylko chronić stan zmienny w fasoli, to wydaje się, że nie służy to żadnym celom w przypadku współbieżności zarządzanej przez kontener.

Z góry dziękujemy za wszelkie informacje na ten temat!

Odpowiedz

0

Ogólnie rzecz biorąc, masz rację ze wszystkimi swoimi oczekiwaniami.Jest tylko jeden drobny przypadek, w którym kod twojego współpracownika może faktycznie korzystać z prymitywów synchronizacji.

Jeśli istnieje plik ejb-jar.xml, można ustawić zarządzanie współbieżnością do zarządzania przez komponent bean. to będzie wyglądać mniej więcej tak:

<enterprise-beans> 
    <session> 
     <ejb-name>MySingletonEJB</ejb-name> 
     <ejb-class>com.blah.MySingletonEJB</ejb-class> 
     <transaction-type>Bean</transaction-type> 
     ... 
    </session> 
... 
</enterprise-beans> 

Od EJB 3, to jest naprawdę zły sposób zrobić rzeczy i adnotacje są zdecydowanie korzystne, ponieważ konfiguracja jest tuż przy źródle.

+0

Nie wierzę, że to istnieje w naszym projekcie. Powtarzał: "Robię to od lat i działa dobrze", ale wydawało się, że nie rozumie, co mówię. Byłoby dobrze, ale zakładając, że to, co czytam, jest poprawne, jego "zsynchronizowane" bloki byłyby po prostu niepotrzebne i nie zwiększałyby przepustowości. –

+0

Mam również ochotę przetestować jego kod i sprawdzić, czy jego synchronizacja rzeczywiście coś robi, ale mam zbyt wiele do zrobienia ... może kiedy dostanę trochę wolnego czasu :) –

0

Masz rację, ale to zależy od tego, na czym się opiera, jeśli obiekt jest powiązany z tym singletonem, to naprawdę jest on znany, co faktycznie spowalnia wykonywanie programu z powodu podwójne blokowanie.

Powiązane problemy