2010-07-09 16 views
5

Pytanie jest nieco dłuższe, ponieważ jest pojęciowe. Mam nadzieję, że nie jest to źle czytane :)Kontroler (Spring Managed Bean) Zakres pytań: Singleton, Request lub Session?

Pracuję w aplikacji sieciowej MVC/Tiles o krytycznym poziomie wydajności (typowo 10 000 użytkowników). Załadujemy ekran pracownika aktualizacji, w którym ładujemy ekran szczegółów pracownika (powiązany z obiektem biznesowym pracownika) w celu aktualizacji za pomocą MultiActionController. Na tym ekranie jest wiele zakładek, ale tylko tab1 ma dane aktualizacyjne. Pozostałe karty są tylko do odczytu, w zasadzie w celach informacyjnych.

Nie trzeba dodawać, że zdecydowaliśmy się załadować te karty tylko do odczytu w leniwy sposób, tj. Po aktywowaniu każdej karty wywołujemy wywołanie ajaxowe (jednorazowe) w celu pobrania danych z serwera. Nie ładujemy wszystkiego za pomocą metody ładowania widoku aktualizacji. Pamiętaj: to jednorazowe dane przeznaczone tylko do odczytu.

Teraz mam dylemat. Zrobiłem kolejny kontroler multiaction, nazwany "AjaxController" do obsługi tych wywołań ajaxowych. Teraz moje pytania:

  1. Jaki powinien być najlepszy zakres dla tego kontrolera?

Myśli: jeśli zgłoszę żądanie, wówczas 10 000 użytkowników może utworzyć 10 000 wystąpień tego problemu: problem z pamięcią. Jeśli ustawię sesję na zakres, wtedy jedna zostanie utworzona na sesję użytkownika. Oznacza to, że gdy 10 000 użytkowników zaloguje się do aplikacji, niezależnie od tego, czy zastosują metody AjaxController, każdy z nich będzie posiadał komponent bean.

  1. Czy zatem najlepszym rozwiązaniem jest ten kontroler?

Myśli: Pojedyncza fasola powstanie podczas wiosennych butów, a to samo wystąpienie będzie dostępne w całym tekście. Brzmi dobrze.

  1. Czy metody obsługi (takie jak fetchTab7DataInJsonFormat) powinny być statyczne i dołączone do klasy?

Myśli: w takim przypadku, czy havign statyczne metody semantycznie mogą być sprzeczne z zakresem? Na przykład: czy scope = "session"/"request" + sensowne są metody statyczne? Pytam, ponieważ nawet jeśli każda sesja użytkownika ma własny komponent AjaxController, metody obsługi są w rzeczywistości dołączane do klasy, a nie do instancji. Ponadto, czy zakres = "singleton" + metody statycznego programu obsługi mają sens?

  1. Czy mogę ręcznie wprowadzić wzorzec projektu singleton do kontrolera AjaxController?

Myśli: Co zrobić, jeśli kontroluję tworzenie: w zasadzie zrobić singleton GoF. Więc co może zrobić specyfikacja zakresu? Sesja zakresu/żądanie z pewnością nie może utworzyć wielu instancji, czy mogą?

  1. Jeśli, niezależnie od mechanizmu (specyfikacja komponentu/wzorzec projektowy/metody statyczne), udaje mi się mieć jedno wystąpienie kontrolera Ajax: Czy te metody STATIC muszą zostać zsynchronizowane? Myślę, że nie, ponieważ nawet jeśli metody obsługi STATIC mogą rozmawiać z usługami (które rozmawiają z DB/WS/MQ itp.), Które wymagają czasu, myślę, że każdy wątek żądania wchodzący do metod statycznych zostanie zwrócony przez ich identyfikator wątku, prawda? Nie jest tak, że użytkownik 1 wprowadza metodę statyczną, a następnie użytkownik 2 wprowadza statyczną metodę, zanim użytkownik 1 został zwrócony, a następnie obydwoje otrzymają nieczytelne dane? Jest to prawdopodobnie głupie, ale chcę być tego pewien.

Jestem zdezorientowany. Zasadniczo chcę dokładnie jednego wystąpienia komponentu bean kontrolera obsługującego wszystkie żądania dla wszystkich klientów.

Uwaga krytyczna: Fasola AjaxController nie jest INJECTED nigdzie indziej, istnieje pojedynczo. Jego metody są trafione poprzez wywołania ajaxowe.

Odpowiedz

3

Gdybym to robił, zdecydowanie robiłbym singleton LazyLoadController bez posiadania statycznych metod i bez żadnego stanu.

Z pewnością nie powinieneś ręcznie tworzyć singletonów, lepiej używać wspólnego mechanizmu Springa i pozwolić, aby struktura kontrolowała wszystko.

Ogólną ideą jest unikanie stosowania statycznych metod i/lub trwałych danych w kontrolerach. Odpowiednim mechanizmem byłoby użycie jakiegoś komponentu bean usługi do generowania danych dla żądania, więc kontroler działa jako dyspozytor parametrów żądań w celu pobrania danych do widoku. W kontrolerze nie wolno dopuszczać stanu zmiennego ani jednocześnie niebezpiecznych. Jeśli niektóre komponenty są specyficzne dla użytkownika, Spring AOP zapewnia wstrzykiwanie komponentów na podstawie sesji/żądania.

To dobra praktyka w takich rzeczach. Jest coś do wyjaśnienia, by dać bardziej konkretną odpowiedź na swoją sprawę. Czy dobrze zrozumiałem, że typowym przypadkiem użycia będzie to, że AjaxController przekaże niektóre żądania do LazyLoadController, aby uzyskać dane karty? Podaj szczegółowe informacje na ten temat w komentarzu lub na pytanie, aby móc zaktualizować moją odpowiedź.

To, co jest nie tak ze statycznymi metodami w sterowniku, polega na tym, że samemu musisz zarządzać równoczesnym bezpieczeństwem, które nie tylko jest podatne na błędy, ale także zmniejsza ogólną wydajność. Spring uruchamia każde żądanie we własnym wątku, więc jeśli dwa równoczesne wywołania wymagają użycia pewnej statycznej metody i istnieją współdzielone zasoby (musisz użyć instrukcji synchronizacji lub blokad), jeden z wątków będzie musiał poczekać, aż inny zakończy działanie w chronionym bloku. Z drugiej strony, jeśli korzystasz z usług bezpaństwowych i unikasz danych, które mogą być udostępniane dla wielu połączeń, uzyskujesz większą wydajność i nie musisz zajmować się współbieżnym dostępem do danych.

+0

Ogromny błąd z mojej strony. LazyLoadController IS AjaxController. Myślałem o jednym nazwisku, gdy zaczynałem pisać pytania, a następnie w trakcie pytań powracałem do innego imienia. Przepraszam, zredagowałem ten post. Tak, masz odpowiedni przypadek. W rzeczywistości mam warstwę usługi, która dokładnie to robi, a ten AjaxController działa jedynie jako program do obsługi żądań i obsługi odpowiedzi. Niektóre z moich wątpliwości pozostają w odniesieniu do scenariuszy konfliktu. Obecnie mój AjaxController jest singleton i ma statyczne metody przetwarzania żądań i interakcji z warstwą usługi. Coś nie tak z tymi ustawieniami? – SpringConfused

+0

Rozumiem. Zaktualizowano moją odpowiedź z wyjaśnieniem, dlaczego statyczne metody są złe. –

Powiązane problemy