Kundendatenbanken mit EJB 3 virtualisieren

Neben der Möglichkeit, EnterpriseBeans über Annotations zu konfigurieren, liefert der EJB-Standard auch die bereits aus den älteren EJB-Versionen bekannte ejb-jar.xml-Datei (im META-INF-Verzeichnis). Falls gleichzeitig Annotationen und die ejb-jar.xml-Datei für die Erstellung von EnterpriseBeans verwendet werden, bekommen die Einträge aus der XML-Datei den Vorzug. Es besteht aber die Möglichkeit, Annotationen und die ejb-jar.xml-Datei gleichzeitig zu verwenden, da die XML-Datei auch nur Teile der Konfiguration beinhalten kann. Mithilfe des persistence-context-ref-Elements sowie dessen Unterelemente (persistence-context-ref-name und persistence-unit-name) kann man mehrere unterschiedliche Datenbankkontexte in dem JNDI ENC (Java Naming and Directory Interface Enterprise Naming Context) registrieren. Über das persistence-unit-context-ref-name-Element wird ein JNDI-Name für den Kontext vergeben. Mithilfe des persistence-unit-name-Elements wird dieser Kontext an eine Datenbank geknüpft. Diese Datenbankverbindung wird, wie es der JPA-Standard beschreibt, in einer persistence.xml-Datei (im META-INF-Verzeichnis) definiert. Üblicherweise ist die Datenbankverbindung über eine Datasource am Application-Server konfiguriert, daher fallen die Einträge in der persistence.xml Datei recht „mager“ aus (Listing 3). An dieser Stelle müssen alle notwendigen Kundendatenbankverbindungen angegeben werden. Die in Listing 3 gezeigte persistence.xml definiert drei Datenbank-Units, die über Datasources (definiert über das jta-data-source element) an unterschiedliche Datenbanken gebunden werden.

Listing 3: persistence.xml
jdbc/oracle/customer1jdbc/postgres/customer2jdbc/mysql/customer3

Sind alle Datasources eingerichtet sowie die Persistence Units in der persistence.xml vollständig vorhanden, werden im nächsten Schritt die Persistence-Kontexte für das BaseDao im ejb-jar.xml eingetragen.

Listing 4: ejb-jar.xml
VirtualDaoImpljavamagazin.virtual.dao.VirtualDaojavamagazin.virtual.dao.VirtualDaoStateless
                    persistence/customer-1
                customer-1
                     persistence/customer-2
                 customer-2
                     persistence/customer-3
                 customer-3

Dabei wird eine lokale zustandslose EnterpriseBean definiert. Über die unterschiedlichen persistence-context-ref-Elemente werden die Datenbankkontexte eingekoppelt. Beim Registrieren der EnterpriseBean am Applikationsserver werden die Kontextreferenzen mit dem im persistence-context-ref-name vergebenen Namen in den JNDI-Baum geschrieben und sind wie folgt daraus zu laden:

Context ctx = new InitialContext(); 
EntityManager manager = (EntityManager)ctx.lookup("java:comp/env/persistence/customer-3");

Jetzt sollte bereits zu erkennen sein, wie es möglich wird, unterschiedliche EntityManager-Instanzen aus dem JNDI in ein und dasselbe DAO zu laden. Nun muss der in Listing 2 vorgestellte Schlüssel noch an den JNDI-Namen des Persistence-Kontexts gebunden werden. Dies kann über eine zentrale Datenbank oder aber auch über eine Properties-Datei oder im „schlimmsten“ Fall hartcodiert im Quellcode geschehen. Der Einfachheit halber wird in diesem Beispiel die Properties-Datei verwendet. Die Möglichkeit, mit einer Konfigurationstabelle zu arbeiten, ist unter „Konfiguration des EntityManager JDNI und dessen Schlüssel“ beschrieben. Die Properties-Datei gerade einmal drei Einträge:

javamagazin.virtual.customer1=java:comp/env/persistence/customer-1
javamagazin.virtual.customer2=java:comp/env/persistence/customer-3
javamagazin.virtual.customer3=java:comp/env/persistence/customer-3
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.