EJB - czy kod jest pobierany i wykonywny uklienta?

EJB - czy kod jest pobierany i wykonywny uklienta?
P1
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:150
0

Czy przy połączeniu klienta (Remote) z z serverem do danego EJB na serverze przez pobranie (w kodzie klienta) InitialContext a potem referencji do tego obiektu EJB z InitialContext następuje rzeczywiste pobranie obiektu (czyli stworzenie duplikatu u klienta) czy tylko referencji do niego (a obiekt jest tylko na serverze)?
A co za tym idzie: czy wywołana potem u klienta metoda interfejsowa na tym pobranym session bean jest realizowana na maszynie wirtualnej klienta czy servera?
Czy to ze klient jest Local a nie Remote coś zmienia w przypadku powyższego pytania?

madmike
Zmień tytuł na sensowny, opisujący problem. REGULAMIN: Temat wątku powinien w sposób sensowny i w miarę wyczerpujący opisywać Twój problem. Tak, aby potem wyszukiwarki nie miały kłopotu ze znalezieniem szukanego tekstu. Wątki opatrzone jednowyrazowym tematem, lub zdaniem nie opisującym zupełnie problemu, będą usuwane.
ŁF
@madmike: pytający chyba nie zrozumiał Twojego komentarza. powinienem anihilować ten wątek, ale zawiera całkiem wartościowe odpowiedzi Shaloma, sam poprawiłem temat.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Oczywiście że wszystko wykonuje się na serwerze! Przecież o to właśnie chodzi. Klient dostaje tylko obiekt "proxy". Działa to podobnie jak RMI.
Jeśli używasz interfejsu Local a nie Remote to jest inaczej. Ale używać Local mozesz TYLKO jeśli twoje EJB i klient są uruchomione na tym samym JVM, w efekcie można wtedy pominąć cała warstwę wywołań zdalnych i po prostu odwoływać się do obiektu bezpośrednio. Zasadniczo nadal wszystko wykonuje się na serwerze, ale wtedy serwer i klient są na tym samym jvm.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
P1
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:150
0

Dzięki. Ale to wywołuje kolejne pytanie.
EJB na serverze ma przypisywany (tworzony) adres JNDI w momencie startowania servera. Czytałem że EJB (jako obiekt swojej klasy) jest zazwyczaj tworzone na żądanie klienta. Czyli ten adres tworzony na starcie jest tylko zarezerwowanym slotem pod EJB które powstanie gdy zgłosi się klient? Czy też EJB tworzone jest wraz ze startem servera i udostępnianie na życzenie?
No i najważniejsze: jeżeli jest ono (obiekt EJB) cały czas na serwerze to czy kilku klientów remote zalogowanych do tego servera na raz, żądających dostępu do tego samego EJB (czyli zasobu JNDI) działa na jednym obiekcie czy też każdy z nich otrzymuje swoją własną kopie tego obiektu na serverze do zdalnego działania na nim?
Jeżeli ma ktoś dobrego (wyczerpującego) linka do tematów EJB i Servlet to proszę o podanie bo ja mam tylko jakieś szczątkowe prezentacje. Nie mogę znaleźć objaśnionych przykładów wiązania EJB z obiektami danych JPA.
Z góry dziękuję.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Wpisz sobie system outy w metodach tworzących albo przeczytaj coś na temat ejb? ;]
Obiekty są tworzone dopiero na żądanie, ale później to już zależy. Stateless są usuwane automatycznie przez kontener, stateful nie, ale nieużywane mogą zostać deaktywowane przez kontener.
Jeśli chodzi o to kto korzysta z jakiego obiektu to nie takie proste. Jeśli masz beany stateless to wywołując na beanie 2 metody nie masz nawet pewności że wykonają się one na tym samym beanie (w przypadku stateful masz taką pewność).
Z tym brakiem materiałów to chyba sobie robisz jaja. Zbanowali ci google i stronę suna/oracla? o_O
http://download.oracle.com/otndocs/jcp/ejb-3_0-fr-eval-oth-JSpec/
tu masz specyfikację w której w zasadzie wszystko masz opisane (zakładam ze mówisz o EJB 3, skoro piszesz o JPA)
http://jaiswaltraining.com/servlet/index.php
tu masz dość fajne tutoriale pokazujące proste przykłady dla EJB, JPA, Servletów etc przy czym są one dość stare w związku z czym olałbym instrukcje instalacji serwera aplikacyjnego na przykład i skupił się tylko na elementach mówiących o implementacji (bo mam nadzieję że umiesz zainstalować sobie serwer i umiesz deployowac na nim beany / servlety)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
P1
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:150
0

Dzięki za odpowiedź. Linka do tej dokumentacji EJB w Oracle to miałem ale ciężko mi tam znaleźć konkretne szczegóły, czyli odpowiedzi na pytanie które mi się rodzą.
Dopytam więc tylko dla pewności. Jeżeli mam bean stateless to każdy klient próbujący korzystać z takiego beana w tym samym czasie ma swoja osobna instancje tego beana? Nie trzeba się martwić o synchronizację rozbudowanych metod interfejsowych tego beana gdyby np. w trakcie ich wykonywania, dla pierwszego klienta, jakieś wyniki pośrednie lądowały w jakichś polach obiektowych a w tym czasie drugi klient chciałby wywołać ten sam bean i jego metodę (to samo JNDI )? Czyli dwa osobne wątki i dwa osobne obiekty pod tym samym adresem JNDI w tym samy czasie?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Jejku na prawdę nie możesz sobie tego doczytać? Warto!
W przypadku beanów stateless nie jest tak że każdy dostaje "swojego beana". Jest tak że w kontenerze masz N beanów i one są przydzielane M użytkownikom wg potrzeb na czas wykonywania pojedynczej metody (kontener tworzy nowe w razie potrzeby, ale zwykle trzyma mniej beanów niż użytkowników). Jak już pisałem wyżej - nie masz pewności że wywołując dwie metody wywołasz je na tym samym beanie! Nie musisz się martwić o żadną synchronizację ALE nie wolno ci zapisywać żadnych danych pośrednich w polach takiego obiektu!

stateless—the session bean instances contain no conversational state between methods; any instance can be used for any client.
Stateless session beans are session beans whose instances have no conversational state. This means that all bean instances are equivalent when they are not involved in servicing a client-invoked method.

Because all instances of a stateless session bean are equivalent, the container can choose to delegate a
client-invoked method to any available instance. This means, for example, that the container may delegate
the requests from the same client within the same transaction to different instances, and that the
container may interleave requests from multiple transactions to the same instance.
A container only needs to retain the number of instances required to service the current client load. Due
to client “think time,” this number is typically much smaller than the number of active clients. Passivation
is not needed or used for stateless sessions. The container creates another stateless session bean
instance if one is needed to handle an increase in client work load. If a stateless session bean is not
needed to handle the current client work load, the container can destroy it.

Traktuj stateless beany jak webservice. Skoro są stateless to znaczy ze NIE przechowują żadnych danych związanych z tożsamością obiektu. Jesli chcesz pomiędzy metodami przchowywać jakieś dodatkowe dane to musisz użyć beanów stateful!


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
kogucik
Mam wrażenie, że mu chodzi o korzystanie ze zmiennych instancyjnych pomiędzy wywołaniami metod prywatnych (np. w celu polepszenia czytelności kodu), a nie zdalnych metod publicznych. Nie rób tego. Zmienne mogą się nadpisywać w nieoczekiwany sposób przez przeplatające się wątki.
P1
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:150
0

Dzięki za to wyjaśnienie. Przelecę ta dokumentację bo parę zagadnień w tych beanach wydaje mi się wzajemnie nie spójne. Gdzieś muszę coś źle interpretować.
Jeszcze raz dzięki.

Shalom
Jak znajdziesz jakieś niespójności to wtedy możesz pytać na forum w kwestii ich wyjaśnienia, ale proszę: nie pytaj o rzeczy podstawowe które w dokumentacji są :)
P1
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:150
0

Przeszedłem przez tą dokumentację EJB (w wersji simplified) i mam jeszcze pewne niejasności. Może to przeoczyłem czytając całość. Dlatego jeszcze jedno pytanie. EJB stateless nie przechowują żadnych danych, z tego jak rozumiem, są tylko elementami (triggerami) do wyzwalania zaimplementowanych metod interfejsowych wpisanych w klasach tych EJB. Mają umożliwiać tylko dostęp z poziomu klienta do danych metod. Może co najwyżej, dostarczają jakieś stałe dane do opera z np. swoich (klasowych) pól statycznych.__ Po co wiec jest ich tworzonych, kilka danego rodzaju, w kontenerze na serwerze? __ Nawet jeżeli jest ich mniej niż klientów to i tak wystarczyłby tylko jeden dla wszystkich połączeń (realizowanych równolegle) gdyż obiekt ten wskazuje tylko kompilatorowi i wirtualnej maszynie, że dany klient chce użyć danej metody. Może więc w ten sposób obsługiwać wszystkich klientów (jako wskaźnik).

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Odpowiedź jest dość trywialna: ze względu na synchronizację, albo raczej jej brak ;] Te obiekty nie mają wymuszonej żadnej synchronizacji więc nie można założyć że są thread-safe.
Sytuacja mogła by być taka:
Twój bean realizując metodę X() zapisuje sobie w jakichś prywatnych polach obiektu jakieśtam tymczasowe dane (np. dlatego że wywołuje sobie metodę Y() i nie chciał przekazywać tam miliona parametrów)
Co się stanie jeśli mamy jednego Beana i dwa obiekty spróbują wywołać X() z różnymi parametrami? Otóż nie wiadomo, bo może się okazać że wywołanie pierwszego X() zostanie przerwane i zacznie się wykonywać drugi X() który podmieniłby te parametry.
Gdyby bean był jeden to mogłoby się okazać że jest wąskim gardłem - jego operacje musiałyby być synchronizowane i realizowane sekwencyjnie dla kolejnych klientów. A jeśli bean robiłby coś co trwa długo (np. komunikował się w jakimiś innymi zdalnymi obiektami) to by była tragedia. Poza tym zakładamy że obiekty EJB nie są jakimiś zasobożernymi potworami i można stworzyć N instancji.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
P1
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:150
0

No ale, jak ustaliliśmy, w EJB stateless nie ma zapamiętywania danych pośrednich w polach obiektowych. Obiekt proxy (odwzorowani EJB) po stronie klienta otrzymuje (jak rozumiem) tylko finalny wynik. Gdzie więc mogą pojawić się zapisane wyniki pośrednie? Zmienne metod tworzone w metodzie dostępne są tylko dla danego wątku i każdy wątek ma ich swoja własną kopie (wersję) więc przeplot wątków w trakcie realizacji tej samej metody nie powinien być dla nich groźny.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Nie nie nie. Nie wolno zapamiętywać danych POMIĘDZY wywołaniami metod EJB, ale przecież nasze EJB może mieć też kupę metod prywatnych, na zasadzie:
metoda dostępna przez interfejs Remote - X(), która wywołuje sobie trzy prywatne metody (które nie są dostępne dla użytkownika).
Zresztą tak jak mówiłem - jeden obiekt EJB mógłby spowodować gigantyczny spadek wydajności, bo przecież wykonania byłoby sekwencyjne ;]


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
P1
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:150
0

Przy wielowątkowym procesorze dwa wątki realizacji (wywołania) tej samej metody na tym samym obiekcie (przy założeniu niezapisywania przez EJB danych pośrednich w polach prywatnych) nie polecą równolegle? Muszą się sekwencjonować?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Jeśli ten obiekt jedyne co wykonuje to jakieś lokalne obliczenia, to pewnie się zrównolegli. Ale bierz pod uwagę fakt że on się może jednak komunikować z kimś innym. Na przykład z jakimś EntityManagerem, który nie jest thread-safe. Zresztą robi się z tego strasznie akademicka dyskusja ;]


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
0
Pierce111 napisał(a)

Przy wielowątkowym procesorze dwa wątki realizacji (wywołania) tej samej metody na tym samym obiekcie (przy założeniu niezapisywania przez EJB danych pośrednich w polach prywatnych) nie polecą równolegle? Muszą się sekwencjonować?

Normalnie moga leciec rownolegle, ale EJB to specjalny przypadek - tutaj kontener zapewnia ze ta sama instancja nie bedzie wywolywana rownolegle.
No chyba, ze mowimy o singleton bean zdefiniowanym tak ze sam zarzada watkami... Ale to inna bajka.

EJB wcale nie musza byc tworzone lazy i pozniej od razu wywalane po uzyciu - moga byc tworzone na starcie cale poole, np setki sztuk, i zyc sobie spokojnie az nie wylaczysz serwera. Albo moga faktycznie byc tworzone za kazdym razem gdy trzeba. Wszystko to jest dozwolone i tzw. implementation specific, a specyfikacja pozwala na takie dowolnosci.

Shalom napisał(a)

Jeśli ten obiekt jedyne co wykonuje to jakieś lokalne obliczenia, to pewnie się zrównolegli. Ale bierz pod uwagę fakt że on się może jednak komunikować z kimś innym. Na przykład z jakimś EntityManagerem, który nie jest thread-safe. Zresztą robi się z tego strasznie akademicka dyskusja ;]

Rozne instancje EJB nie beda mialy dostepu do tej samej instancji EntityManagera, o to dba kontener. Chyba ze mowimy o Stateful Beanie ktory wola kolejny stateful, wtedy nastepuje propagacja kontekstu transakcji i em, ale wtedy nie zachodzi zadne zrownoleglenie.

P1
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:150
0

Dzięki

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)