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.xmljdbc/oracle/customer1 jdbc/postgres/customer2 jdbc/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.xmlVirtualDaoImpl javamagazin.virtual.dao.VirtualDao javamagazin.virtual.dao.VirtualDao Stateless 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
Hinterlasse einen Kommentar