Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it safe to inject an EJB into a servlet as an instance variable?

We all know that in the web tier there is the possibility that only a single instance of a given Servlet exists which services multiple requests. This can lead to threading issues in instance variables.

My question is, is it safe to inject an EJB using the @EJB annotation into a servlet as an instance variable?

My initial instinct would be no, under the assumption that the same instance of the EJB would service multiple requests at the same time. It would seem that this would also be the instinct of a number of other programmers: Don't inject to servlets

However have I jumped to the wrong conclusion. Clearly what is injected into the servlet is a proxy, under the hood does the container actually service each request with a different instance and maintain thread safety? As this forum would suggest: Do inject to servlets

There seems to be a lot of conflicting opinions. WHICH IS CORRECT???

like image 667
Brett Hannah Avatar asked Mar 06 '09 10:03

Brett Hannah


People also ask

How to inject EJB in Java class?

You can inject it when you use CDI, otherwise you can only inject it into other EJB's and servlets (if your application server supports it). Context ctx = new InitialContext(); MyEjb ejb = (MyEjb) ctx. lookup("java:comp/env/myEjb");

Which annotation is used to inject an EJB into another EJB?

Like resource injection, you can inject Session bean references into another EJB or other managed class using annotations or deployment XML. If you prefer annotations you can use @javax. ejb. EJB annotations to inject either remote or local EJB references.

What is dependency injection in EJB?

Advertisements. EJB 3.0 specification provides annotations, which can be applied on fields or setter methods to inject dependencies. EJB Container uses the global JNDI registry to locate the dependency. Following annotations are used in EJB 3.0 for dependency injection.


1 Answers

It is safe to inject an EJB in a Servlet as a Servlet instance variable, as long as the EJB is Stateless. You MUST NEVER inject a Stateful Bean in a Servlet.

You must implement your EJB stateless in that it doesn't hold any instance variable which itself holds a stateful value (like Persistence Context). If you need to use the persistence context, then you must get an instance of it IN the methods of the EJB. You can do that by having a PersistenceContextFactory as a EJB instance Variable and then you get an instance of the entity manager from the Factory in the method of the EJB.

The PersistenceContextFactory is thread-safe, thus it can be injected in an instance variable.

As long as you comply to the above mentioned rules, it should be thread-safe to inject a Stateless Bean in a Servlet

like image 117
user82650 Avatar answered Oct 21 '22 07:10

user82650