Frage

Wir alle wissen, dass in dem Web-Tiere die Möglichkeit besteht, dass nur eine einzige Instanz eines bestimmten Servlet existiert, die mehrere Anfragen bedient. Dies kann Probleme in Instanzvariablen führen zu Threading.

Meine Frage ist, ist es sicher ein EJB mit der @EJB Anmerkung in ein Servlet als Instanzvariable zu injizieren?

Mein erster Instinkt wäre, nein, unter der Annahme, dass die gleiche Instanz des EJB mehr Anfragen zur gleichen Zeit bedienen würde. Es scheint, dass dies auch der Instinkt einer Reihe von anderen Programmierern sei: zu Servlets injizieren Sie

Es scheint eine Menge widersprüchlicher Meinungen zu sein. Was ist richtig ???

War es hilfreich?

Lösung

Ihre Referenz „Nicht injizieren zu Servlets“ erwähnt nichts über EJBs oder @ejb Anmerkung. Er spricht über nicht sichere Objekte wie PersistenceContext fädeln.

Per EJB-Spezifikation Sie EJBs aus Vielzahl von Remote-Clients einschließlich Servlets (EJB 3.0-Spezifikation (JSR-220) - Abschnitt 3.1) zugreifen kann. Injizierenden EJB @EJB Annotation verwendet, ist eine Methode der EJB-Schnittstelle über Abhängigkeitsinjektion (Abschnitt 3.4.1) zu erhalten, die zum Nachschlagen EJB-Objekte in dem JNDI-Namensraum Alternative. So gibt es nichts Besonderes @EJB Anmerkung in Bezug auf EJBs erhalten.

So, basierend auf EJB 3.0 Spec, ist es eine gängige Praxis EJBs von Servlets mit @EJB Anmerkung zu erhalten.

Andere Tipps

Es ist sicher ein EJB in einem Servlet als Servlet Instanz-Variable zu injizieren, solange die EJB Stateless ist. Sie dürfen niemals eine Stateful Bean in einem Servlet injizieren.

Sie müssen Ihre EJB staatenlos in implementieren, dass sie keine Instanzvariable hält, die selbst eine Stateful-Wert (wie Persistence Context) hält. Wenn Sie die Persistenz Kontext verwenden müssen, dann müssen Sie eine Instanz davon in den Methoden des EJB erhalten. Sie können dies tun, indem eine PersistenceContextFactory als EJB-Instanz Variable hat und Sie dann eine Instanz des Entity-Manager aus der Fabrik in dem Verfahren der EJB erhalten.

Die PersistenceContextFactory threadsicher ist, so kann es in einer Instanzvariablen injiziert werden.

Solange Sie auf die oben genannten Regeln entsprechen, sollte von Thread-sicher sein, eine Stateless Bean in einem Servlet zu injizieren

Es ist eine bunte Mischung.

Stateless Session Beans können sicher injiziert werden und sind. Dies liegt daran, selbst wenn eine einzelne Instanz eines Stub verwendet wird, den Zugriff auf die Methoden vom Container serialisiert werden.

Ich denke, was inferreddesign sagt, ist nicht wahr . Dabei spielt es keine Rolle, ob die Stateless Session Bean eine Persistenzkontext verwendet. Nur ein Anrufer wird je eine einzelne Bean-Instanz zur gleichen Zeit zugreifen, so dass, obwohl die Persistenzkontext nicht sicher ist, fädelt, die EJB schützt gegen mehrere Zugriff darauf. Denken Sie daran, als ob jede Session-Bean-Methode hat die synchronisierte Schlüsselwort auf sie angewendet.

Das Hauptproblem bei einer EJB in einem Servlet-Injektion Ich denke, die Leistung ist. Die Single-Stub-Instanz wird ein wichtiger Bereich des Anstoßes, wenn mehrere Anfragen werden Schlange stehen, während für eine Session-Bean-Methode wartet auf sie ausgeführt werden.

Ich denke, die einfache Antwort ist, dass Sie nicht garantiert, dass es sicher ist.

Der Grund dafür ist, dass es nichts explizit in der EJB-Spezifikation ist, die Schnittstellen EJB-Home sagt müssen sicher sein fädeln. Die Spezifikation beschreibt das Verhalten der Server-Seite nur teilweise. Was werden Sie wahrscheinlich feststellen, dass die Client-Skelette tatsächlich Thread-sicher sind, aber Sie würden brauchen, zu betrachten, wie sie von der Bibliothek implementiert werden Sie verwenden. Der Teil Anmerkung erweitern wird nur in ein Service-Locator, so dass Sie nichts kauft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top