Ich erstelle gerade eine EJB3-Datenzugriffsklasse für alle Datenbankvorgänge in meiner Java EE 6-Anwendung. Jetzt, da Java EE 6 die neue ApplicationScoped-Annotation bereitstellt, frage ich mich, welchen Status mein EJB haben sollte oder ob es zustandslos sein sollte.JavaEE6 DAO: Sollte es @Stateless oder @ApplicationScoped sein?
Wäre es besser, wenn das DAO eine @Stateless Session Bean oder eine @ApplicationScoped Bean ist? Was ist mit @Singleton? Was sind die Unterschiede zwischen diesen Optionen im Zusammenhang mit einem DAO?
EDIT: Ich bin mit Glassfish 3.0.1 mit der vollen Java EE 6-Plattform
Danke für die Antwort! Ich möchte hier nicht diskutieren, wenn ein DAO sinnvoll ist. Für mich macht es Sinn, einen zu verwenden. Zumindest, bis das Seam 3 Persistence Modul zur Produktion bereit ist;) Sie sagen also, dass ich die DAO-Ebene nicht an die EJB-API binden soll. Aber was ist mit Transaktionen und Sicherheit? Wo würde ich diese Dienste verwenden, wenn nicht für Datenbankoperationen -> DAO? Diese Dienste werden von CDI nicht zur Verfügung gestellt, jedenfalls nicht so wie der reguläre JavaEE6-Container. Oder sollte ich CDI und EJB mischen? – ifischer
@ifischer: DAOs sollten KEINE Verantwortung für die Kontrolle und Abgrenzung der Transaktion (oder Sicherheit) tragen, dafür sollte man eine SLSB (Session Facade) verwenden. Also, ja, benutze EJB und CDI. –
> 'EJBs werden durch den Container gepoolt, wenn Sie N Instanzen pro Pool und Tausende von Tabellen haben '- 1. Wenn Sie Tausende von Tabellen und Tausende von Entitäten haben, müssen Sie möglicherweise Ihr Design überarbeiten. Darüber hinaus werden EJB-Instanzen in der Regel auf Anfrage und nicht im Voraus erstellt, und zwar nicht auf einmal für die gesamte Poolkapazität. Dann, selbst wenn Tausende von ihnen erstellt würden, ist der Speicherbedarf von Tausenden von Instanzen kaum ein Megabyte, was völlig unbedeutend ist. Beim Starten des App-Servers fallen einige zusätzliche Kosten an (was ich mit der Bereitstellungszeit meine) –