2011-01-03 16 views
5

Pracuję nad aplikacją Java EE 5 działającą w środowisku Websphere 7.0 i próbuję znaleźć bezpieczną i wydajną dla wątków metodę wielowątkowego utrzymywania rekordów dziennika inspekcji bazy danych. Czy istnieją znane metody bezpiecznego i wydajnego wykonywania rejestrowania wielowątkowego w aplikacji Java EE?Jak przeprowadzić wielowątkowy program rejestrujący inspekcję bazy danych Java EE?

Jeśli potrzebujesz informacji podstawowych: aplikacja jest usługą sieci Web, a każda wiadomość żądania, którą otrzymuje, powoduje utworzenie 100 lub 200 komunikatów dziennika kontroli, które muszą zostać utrwalone w bazie danych. Początkowo rejestrowanie inspekcji zostało wykonane za pomocą niestandardowej procedury obsługi procedur, która rozszerza java.util.logging.Handler, a metoda publikowania otwiera połączenie z bazą danych, wypełnia przygotowaną instrukcję z LogRecord i wykonuje wstawkę. Ponieważ ten niestandardowy moduł obsługi działał w wątku EJB, rejestrowanie inspekcji mogło dodać do kilku sekund czasu odpowiedzi dla każdego komunikatu żądania i powodowało utratę umów SLA.

Tak więc procedura obsługi repozytorium została zastąpiona procedurą obsługi opakowania, która dodaje osobny wątek (tak, z nowym wątkiem(), wbrew zasadom Java EE). Program obsługi otoki używa wektora do kolejkowania rekordów kontroli i utrzymuje je tak szybko, jak to możliwe w oddzielnym wątku za pomocą procedury obsługi procedur kontroli.

Chociaż łamie zasady gwintowania Java EE, to opakowanie działa całkiem dobrze ... , dopóki nie zezwoliliśmy na współbieżne wywołania na MDB. Opakowanie może się zepsuć, gdy wiele wywołań EJB jest dozwolone i potencjalnie będzie zapisywać każdy rekord dziennika do bazy danych wiele razy. Wydaje się to wskazywać, że logika tworzenia opakowania lub wątku ma błąd.

Miałem zamiar pracować nad zidentyfikowaniem i naprawieniem tego problemu, ale pomyślałem, że najpierw zapytam SO, czy jest lepszy sposób.

+0

co masz na myśli przez współbieżne inwokacje na MDB? Mamy podobny model z wyjątkiem faktu, że zamiast MDB korzystamy z MessageListener od wiosny. –

+0

Właściwość ActivationSpecification ma właściwość "Maksymalna liczba sesji serwera" w celu określenia, ile wiadomości może być obsługiwanych jednocześnie przez jedną właściwość ActSpec. Wcześniej mieliśmy 1, więc tylko 1 wiadomość była obsługiwana na serwer w danym momencie. Gdy zwiększysz tę liczbę do> 1, wiele wiadomości zostanie obsłużonych przez serwer w danym momencie. –

+0

Wygląda na to, że używasz produktu WebSphere MQ. "Maksymalna liczba sesji serwera" wydaje się być właściwością custome dla WMQ, a nie MDB. Proponuję więc opublikować go na forum MQ. –

Odpowiedz

3

Użycie JMS, umieszczenie tych komunikatów kontroli w kolejce, a następnie wywołanie innej usługi, która je odbierze i zapisze w bazie danych. Oznacza to oczywiście, że wszystkie dzienniki niekoniecznie będą przechowywane w bazie danych w czasie rzeczywistym, ale to podejście wyładuje trochę pracy z Websphere i nie będziesz mieć standardowego łamania wielowątkowości w kodzie.

+0

Dzięki, to jest dobry pomysł. Myślę, że spróbuję proof-of-concept, aby zobaczyć, jak radzi sobie z ładunkiem. –

Powiązane problemy