2015-05-23 4 views
5

Ich möchte eine Login-App in Java EE machen. Ich dachte daran, es mit einer HTML-Seite, einem Servlet und einer Entitätsklasse für den Benutzer zu implementieren, aber es scheint, dass EntityManager nicht threadsicher ist (kann nicht in das Servlet eingefügt werden und ich brauche es, um die Datenbank zu überprüfen).IndentityManager in Servlet injizieren, scheint es nicht thread sicher

Ich lese über EntityManagerFactory, aber ich will nicht das Leben der produzierten EntityManager verwalten, wenn ich den Container tun kann. Ich denke, dass einige Implementierungen, die das DAO-Muster verwenden, gemacht werden können, damit ich einen Entity Manager im Servlet haben kann, etwas wie DAOImpl, das einen Manager enthält, und diese Klasse als private Variable im Servlet habe. Aber ich konnte keine nützlichen Tutorials online finden.

Könnte jemand dafür eine Implementierung bereitstellen?

+0

Ein Objekt kann nur dann nicht threadsicher sein, wenn es einen veränderbaren Zustand hat. Warum also nicht mit einem zustandslosen Objekt authentifizieren? Ist das nicht etwas, für das eine @Stateless Session Bean (Teil von EJB 3.0) gedacht ist? – scottb

+0

Wie genau injizieren Sie es, was Sie glauben macht, dass es nicht threadsicher ist? – BalusC

Antwort

1

Der Weg zu gehen ist, einen LoginService als @Stateless zu erstellen. Es sollte den EntityManager enthalten. Dieses EJB-Problem betrifft die Verwaltung der Anmeldung.

Jetzt injizieren Sie das EJB in Ihr Servlet.

Der Container kümmert sich um die Nebenläufigkeit.

http://www.adam-bien.com/roller/abien/entry/is_in_an_ejb_injected

+0

Auch hier: http://tamanmamed.blogspot.cz/2012/03/jpa-thread-safety-when-injecting.html – dmatej

1

Folgen der Oracle-Dokumentation vorgeschlagen here sollte jeder Ansatz tun: Entweder:

Injecting EntityManagerFactory in Ihrem dao impl über SerlvetContextListener.

@PersistenceUnit   
private EntityManagerFactory emf; 

Oder Injizieren der EntityManager in Ihrem DaoImpl.

@PersistenceContext 
    private EntityManager em;