Mittwoch, 23. Mai 2012


Artikel

Juni 2008 | Artikel

Kundendatenbanken mit EJB 3 virtualisieren Fortsetzung, Teil 2

Teil 1   Teil 2   Teil 3   Teil 4   

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.

  1. Listing 3: persistence.xml
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
  5. version="1.0">
  6. <persistence-unit name="customer-1" transaction-type="JTA">
  7. <jta-data-source>jdbc/oracle/customer1</jta-data-source>
  8. </persistence-unit>
  9. <persistence-unit name="customer-2" transaction-type="JTA">
  10. <jta-data-source>jdbc/postgres/customer2</jta-data-source>
  11. </persistence-unit>
  12. <persistence-unit name="customer-3" transaction-type="JTA">
  13. <jta-data-source>jdbc/mysql/customer3</jta-data-source>
  14. </persistence-unit>
  15. </persistence>

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.

  1. Listing 4: ejb-jar.xml
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
  5. version="3.0">
  6. <enterprise-beans>
  7. <session>
  8. <ejb-name>VirtualDaoImpl</ejb-name>
  9. <local>javamagazin.virtual.dao.VirtualDao</local>
  10. <ejb-class>javamagazin.virtual.dao.VirtualDao</ejb-class>
  11. <session-type>Stateless</session-type>
  12. <persistence-context-ref>
  13. <persistence-context-ref-name>
  14. persistence/customer-1
  15. </persistence-context-ref-name>
  16. <persistence-unit-name>customer-1</persistence-unit-name>
  17. </persistence-context-ref>
  18. <persistence-context-ref>
  19. <persistence-context-ref-name>
  20. persistence/customer-2
  21. </persistence-context-ref-name>
  22. <persistence-unit-name>customer-2</persistence-unit-name>
  23. </persistence-context-ref>
  24. <persistence-context-ref>
  25. <persistence-context-ref-name>
  26. persistence/customer-3
  27. </persistence-context-ref-name>
  28. <persistence-unit-name>customer-3</persistence-unit-name>
  29. </persistence-context-ref>
  30. </session>
  31. </enterprise-beans>
  32. </ejb-jar>

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:

  1. Context ctx = new InitialContext();
  2. 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:

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

Teil 1   Teil 2   Teil 3   Teil 4   

Kommentare