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.
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. –
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. –
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. –