2013-04-03 12 views
8

Zajmuję się tworzeniem bardzo prostego serwisu WWW REST z implementacją Eclipse, Tomcat7 i Jersey, z połączeniem z MySQL. Patrząc na dokumentację koszulki wiem, że każde żądanie tworzy nowy obiekt klasy zasobów root. Ale nie wiem, czy każde żądanie jest niezależne, na przykład jeśli jedna prośba musi długo czekać, serwer zaakceptuje więcej żądania normalnie?jednoczesna prośba o serwis relaksacyjny koszulki

Problem: Mam 2 główne klasy, 1 klasa implementuje Jersey z adnotacjami (Proxy.java) i inną klasą, która łączy się z BD (Notificator.java), istnieje tylko jedno wystąpienie tej klasy (Singleton) w celu użycia tylko jednego obiektu Connection. Klasy, które wdrażają Jersey, używają tej klasy. Tak więc, jeśli jedno z żądań jest zablokowane, nie wiem, czy inne będą działać, ponieważ używają tej samej instancji (Notificator.java).

Relacja jest N wystąpień (Proxy.java) używa tylko jeden (Notificator.java) ma jedno połączenie z MySQL.

+0

dlaczego chcesz mieć tylko jedno połączenie z DB? –

+0

Zrobiłem to dla prostoty i uniknięcia problemów z współbieżnością. –

Odpowiedz

3

Jersey został opracowany na szczycie serwletów. Dla każdego przychodzącego żądania jest nowy wątek. Twój kod tworzy wąskie gardło dla wszystkich wątków, ponieważ istnieje rywalizacja o pojedynczy dostępny obiekt połączenia. Jeśli masz wiele żądań, tylko jedno żądanie będzie korzystało z tego połączenia, a inne będą musiały czekać. Jeśli oczekiwanie nie trwa zbyt długo, nie ma problemu. Ale jeśli oczekiwanie jest dłuższe niż TIMEOUT ŻĄDANIA HTTP, wtedy twoje inne żądania mogą zakończyć się jako WYZNACZONE.

Rozumiem, że możesz mieć jedno wąskie gardło połączenia ze względu na pewne wymagania biznesowe/komplikacje. Tak więc we wszystkich takich przypadkach, w których nie możemy przetworzyć wszystkich żądań jednocześnie i może istnieć wiele różnych przyczyn, powinniśmy stworzyć nasze usługi sieciowe jako Asynchroniczne. Asynchroniczne usługi sieciowe działają na modelu ŻĄDANIA ZGŁOSZENIA -> ŻĄDANE AKCEPTOWANE (będą przetwarzane asynchronicznie) i ŻĄDANY URL URL zwrócony do odpytywania-> ŻĄDANIA KLIENTA do momentu, ŻE ZAKOŃCZENIE NIE ZOSTANIE ZAKOŃCZONE.

Mam nadzieję, że pomoże!

+0

"Dla każdego z przychodzących jest nowy wątek", to był ważny punkt !! Dzięki wielkie. Wiem, że jest wąskie gardło, ponieważ korzystam tylko z jednego połączenia, ale zwykle będzie tylko 2 lub 3 jednoczesne żądanie, więc myślę, że nie będzie problemów z taht. Ale będę studiować "asynchroniczną usługę internetową". –

0

Spróbuj łączenie połączenie z bazą danych, więcej na ten temat tutaj:

http://en.wikipedia.org/wiki/Connection_pool

How to establish a connection pool in JDBC?

+0

thx, ale w końcu mój nauczyciel powiedział mi, że łączenie połączeń będzie trudne do wdrożenia, więc użyłem słowa kluczowego "zsynchronizowane" w klasie Notificator, aby uniknąć problemów współbieżności. Uświadomiłem sobie również, że każde wezwanie do koszulki jest niezależne, więc jeśli jeden z nich wywoła bloki, inni będą działać normalnie. –

+0

Za pomocą słowa kluczowego 'synchronized' blokujesz inne połączenia. Jeśli tego właśnie potrzebujesz, to dobrze. – Vitaly

+0

Blokuję inne połączenia, ale kiedy zasób jest dostępny, budzą się? to właśnie wyjaśnił mi mój nauczyciel. I to działa dla mnie. –

Powiązane problemy