2010-07-11 9 views
16

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

Antwort

12

Whould es besser sein, die DAO lassen eine @Stateless Session Bean sein, oder ein @ApplicationScoped Bean ? Was ist mit @Singleton? Was sind die Unterschiede zwischen diesen Optionen im Zusammenhang mit einem DAO?

I Stateless Session Beans für DAOs NICHT verwenden würde: durch den Behälter

  1. EJBs werden gepoolt so, wenn Sie N Instanzen pro Pool und Tausende von Tabellen haben, Sie gehen nur Ressourcen zu verschwenden (Nicht einmal die Kosten zur Bereitstellungszeit zu erwähnen).

  2. Die Implementierung von DAOs als SLSB würde die EJB-Verkettung unterstützen, was aus Skalierbarkeitsgründen keine gute Praxis ist.

  3. Ich würde die DAO-Ebene nicht an die EJB-API binden.

Die @Singleton in EJB 3.1 eingeführt Dinge ein bisschen besser machen könnte, aber ich würde DAOs als EJBs noch nicht umsetzen. Ich würde lieber CDI (und vielleicht ein benutzerdefiniertes Stereotyp, siehe this article zum Beispiel).

Oder ich würde DAOs überhaupt nicht verwenden. Der Entity Manager von JPA ist eine Implementierung des Domain Store Patterns und der Wrapping-Zugriff auf einen Domain Store in einem DAO fügt nicht viel hinzu.

+0

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

+0

@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. –

+5

> '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) –

0

@Pascal: Meiner Meinung nach ist meine DAO nicht "verantwortlich" für Transaktion oder Sicherheit, da der Container diese Dienste verwaltet. Ich notiere nur die Methoden in meinem DAO (nur aus Sicherheitsgründen, da Transaktionen automatisch verarbeitet werden). Sind Annotationen bereits "Verantwortung"?

Okay, so dass Sie mich über mein Design denken lassen. Ich hoffe, es ist okay und nicht zu weit vom Thema, aber vielleicht hilft es - das ist, wie ich JEE6 heute bin mit:

  • JSF greift auf eine CDI Bean,
  • die CDI Bean greift auf die DAO-EJB die macht die "Business-Logik"
  • so derzeit meine einzige "Business-Logik" macht CRUD, später werde ich einige andere EJBs für kritische Aufgaben wie asynchrone Methoden oder Timer-Dienste hinzufügen.
  • mein DAO ist generisch und verwendet die JPA2 Criteria Query für typsichere Abfragen (überhaupt keine Zeichenfolgen)
  • Ich weiß, dass ich kein DAO für persist/update/remove brauche (zu einfach), aber ich brauche es für meine Fragen; also setze ich sie zusammen

Ist etwas falsch mit diesem Ansatz?

1

Nach einigen Umdenken scheint es, wie DAO eigentlich nicht der richtige Name für das, was ich tun wollte. Vielleicht ist es wirklich eine Fassade, wie Pascal sagte. Ich habe gerade das Netbeans Petstore-Beispiel gefunden - eine JavaEE6-Beispielanwendung, siehe here - wo sie eine ItemFacade haben, die für das Suchen/Erstellen/Entfernen von Entitäten aus der Datenbank zuständig ist. Es ist eine Stateless Session Bean. Sieht wie folgt aus:

@Stateless 
public class ItemFacade implements Serializable { 
    @PersistenceContext(unitName = "catalogPU") 
    private EntityManager em; 

    public void create(Item item) { ... } 
    public void edit(Item item) { ... } 
    public void remove(Item item) { ... } 
    public Item find(Object id) { ... } 
    public List<Item> findAll() { ... } 
    public List<Item> findRange(int maxResults, int firstResult) { ... } 
    public int getItemCount() { ... } 
} 

So als Abschluss DAO meine DAO nenne ich nicht mehr, sondern nur zum Beispiel PersonEJB (ich glaube „PersonFacade“ falsch verstanden werden könnte) und machen es auch @Stateless, wie ich denke, Das Netbeans-Beispiel kann als gut entworfen betrachtet werden.

+0

Was ist der letzte Teil meiner Antwort: keine DAO überhaupt und eine [Sitzung Fassade] (http: //java.sun. com/Blueprints/corej2eepatterns/Patterns/SessionFacade.html) für die Transaktionssteuerung und Sicherheit, ein SLSB ist der natürliche Kandidat in Java EE. Nun, ich muss sagen, dass die obige Antwort zunächst nicht Ihre * anfängliche * Frage beantwortet und zweitens (praktisch) Ihre eigene Frage so umformuliert, dass sie Ihrer Antwort entspricht, motiviert mich nicht dazu, mehr Zeit dafür zu verwenden. Viel Glück trotzdem. –

+1

Geänderte akzeptierte Antwort. Bist du jetzt glücklich? ;) Du hast Recht, diese Antwort hat nichts mit meiner ersten Antwort zu tun. Danke für Ihre Hilfe. – ifischer

Verwandte Themen