Ich arbeite an einem Projekt, bei dem wir mehrere eigenständige Module erstellen müssen, die sich mit einer Datenbank verbinden. Diese Module sind hauptsächlich Hintergrund-Geschäftsprozesse, also nicht viel Frontend. Außer einem Webmodul, das die Daten anzeigt und grundlegende CRUD-Funktionen zulässt. Dazu planen wir die folgenden Techniken:
Der ursprüngliche Plan bestand darin, einfach eine JAR-Datei (mit einer Hauptmethode) pro Modul zu erstellen und sie als (Windows-) Dienst über einen Service-Wrapper zu installieren. Für unser Webmodul würden wir Glassfish oder JBoss verwenden, um es auszuführen. In letzter Zeit kam uns jedoch Java EE in den Sinn. Wir könnten alle unsere Module in einem Java EE-Container wie Glassfish oder JBoss ausführen, nicht nur unser Webmodul. Einige Fragen für den Fall, dass wir uns für Java EE entscheiden:
Andere haben auf einige der Vorteile hingewiesen, daher hier einige Nachteile, wenn Sie den Hintergrundprozess in dasselbe jvm wie Ihre Web-App implementieren.
JPA ist innerhalb und außerhalb des Containers gleich. Der einzige Unterschied besteht darin, wie Sie einen EntityManager erhalten, der mit Spring so konfiguriert werden kann, dass er innerhalb und außerhalb des Containers gleich ist. CDI sollte außerhalb des Containers ausgeführt werden können.
Die wichtigsten Unterschiede bestehen darin, wie Sie Transaktionen mit der Datenbank durchführen, zum Beispiel mit Spring-Transaktionen im Vergleich zu ejb-Transaktionen.
Aktualisierung: Um Ihre Frage zu beantworten, geben Sie den Kommentar ein: In JPA ist der EntityManager nicht threadsicher, so dass in einem Java EE Server ein Entity Manager pro Persistenzeinheit pro Thread existiert. Die Erstellung und Schließung des Entity-Managers wird vom App-Server für Sie verwaltet. Jeder Entity Manager hat einen Cache darin. Es ist möglich, einen Second-Level-Cache zu konfigurieren, der mehrere Entity-Manager umfasst. Wenn Sie außerhalb des Containers arbeiten, müssen Sie die Anzahl der JPA-Entity Manager selbst verwalten. Dies hängt von der Anzahl der Threads in Ihrem Hintergrundprozess und den Transaktionsgrenzen ab, die Sie haben möchten. Wenn Sie sich ein Buch mit dem Titel "Pro JPA2" ansehen, gibt es einen Abschnitt, der über die Details des Laufens innerhalb oder außerhalb des Containers spricht.
In meiner Anwendung habe ich keinen Hintergrundprozess, aber jede Klasse, die einen Entity Manager benötigt, wird nur mit @PersistenceContext EntityManager em;
injiziert und spring sorgt dafür, dass alles innerhalb und außerhalb des Containers funktioniert. Spring 3.1 hat ein Feature namens profiles, das es trivial macht, den gleichen Code innerhalb unseres Containers zu verwenden, ohne eine einzelne Codezeile zu ändern. Ich bin kein CDI-Benutzer, daher weiß ich nicht, ob CDI ein Äquivalent der Feder 3.1-Profile-Funktion hat.
Wenn sich alle Module (Batch + Echtzeit) auf ein Produkt beziehen, dann ist es ein guter Ansatz, sie zusammen zu bündeln. Also hier ist mein Vorschlag
Antworten auf Ihre spezifischen Fragen
CDI kann auch ohne EJB verwendet werden. Jedenfalls werde ich den Frühling los, da ich keinen Mehrwert für dein einfaches Projekt sehe.
Es gibt keinen Unterschied außer der Tatsache, dass Sie die DataSource von JNDI beziehen können.
Ja, es ist sinnvoll, Batch- und Echtzeitaspekte eines einzelnen Produkts zu bündeln, solange keine Leistungsprobleme auftreten.
Es ist sinnvoll, in einem Anwendungsserver statt in einem eigenständigen Java-Programm für die üblichen Gründe wie
zu laufen1) Sie können CDI mit Feder verwenden, da EJB3 ebenfalls auf einem ähnlichen Konzept basiert. 2) Es gibt keinen Unterschied in Bezug auf JPA, außer dass, wenn Sie später mehr Volumen zu der Anwendung hinzufügen müssen, das Laden durch Hinzufügen weiterer Maschinen hinzugefügt werden kann, die dieselbe Anwendung ausführen. Beachten Sie jedoch, dass dies eine nicht-kommerzielle Anwendung ist. triviale Menge an Arbeit und daher hängt es von der geschäftlichen Anforderung ab, die Wahl zu treffen 3) Anwendungsserver gewinnen eigenständige Anwendungen aus Gründen der integrierten Sicherheit, Zuverlässigkeit, Verwaltung und Skalierbarkeit über eigenständige Java-Apps.