Datenbankbedingungen für EJB-Abfragen
Die EJB-Abfragefunktionen (Enterprise JavaBeans) müssen bestimmte Bedingungen für Datenbanken erfüllen.
Allgemeine Einschränkungen für Datenbanken
- Alle in eine Abfrage einbezogenen Enterprise-Beans müssen derselben Datenquelle zugeordnet sein. Die EJB-Abfrage unterstützt keine Verknüpfungsoperationen für mehrere Quellen.
- Es ist möglich, dass eine SQL-Anweisung (Structured Query Language), die
von einem WAS-Dienstprogramm (WebSphere Application Server) zur Codegenerierung
für eine ejbSelect-Abfrage in der EJB-Abfragesprache generiert wurde,
Zeilen in einer Ergebnismenge zurückgibt, die in allen Spalten Nullwerte enthalten.
Während der Ausführungszeit speichert der Persistenzmanager die Ergebnismenge, die aus dieser Abfrage resultiert. Wenn Ihre Anwendung den Primärschlüssel der Ergebnis-Bean abruft, dann ruft der Persistenzmanager die Extrahierungskomponente (extractor) auf. Dies ist eine Methode, die einer von der EJB-Implementierung generierten Klasse entspricht. Diese Methode gibt für alle Spalteneinträge den Wert 0 (null) zurück. Dieser Wert wird zur Weiterleitung an die Anwendung an den EJB-Container zurückgegeben. Der EJB-Container ruft die Bean-Instanz mit dem PK-Wert 0 auf. Dies könnte problematisch sein, da der Endbenutzer nicht feststellen kann, ob diese Bean-Instanz keinen PK-Wert oder einen PK-Wert von 0 besitzt.
Zur Vermeidung dieser Situation sollten Sie in der Finder-Abfrage die Klausel IS NOT NULL verwenden, um solche Nullwerte aus der Ergebnismenge zu entfernen.
Spezifische Datenbankbedingungen
Bei den verschiedenen Datenbankprodukten gelten unterschiedliche Bedingungen für Elemente, die in EJB-Abfrageanweisungen aufgenommen werden dürfen. Diese Bedingungen sind nachfolgend aufgelistet. Fragen Sie Ihren Datenbankadministrator, welche der Bedingungen für Ihre Umgebung gelten könnten:
- Bestimmte Abfragefunktionen werden nur in DB2-Abfragen verwendet, weil diese Funktionen von anderen Datenbanken nicht unterstützt werden. Zu diesen Funktionen gehören arithmetische Ausdrücke für Datum und Uhrzeit, bestimmte Skalarfunktionen wie die nicht als übertragbar auf andere Lieferanten angegebenen Skalarfunktionen und implizite Skalarfunktionen, die bei der Zuordnung bestimmter CMP-Felder verwendet werden. Nehmen wir an, Sie möchten ein numerisches Feld vom Typ Int einem Feld vom Typ Decimal zuordnen (5,2). Bei einer Implementierung in einer anderen Datenbank als DB2 würde eine FINDER- oder SELECT-Abfrage, die ein CMP-Feld mit dieser speziellen Zuordnung enthält, scheitern und die Fehlernachricht Cannot push down query erzeugen.
- Ein CMP-Typ String, der einem CLOB (Character Large Object) in der Datenbank zugeordnet ist, kann nicht in Vergleichsoperationen verwendet werden, weil die Datenbank keine CLOB-Vergleiche unterstützt.
- Datenbanken können Bedingungen hinsichtlich der Länge der Zeichenfolgewerte etablieren, die in Vergleichsoperationen als Literale oder Eingabeparameter verwendet werden. Diese Bedingungen können sich negativ auf den Durchsatz von Abfragen auswirken. Die Suche "name = ?1" kann beispielsweise für DB2 auf der z/OS-Plattform scheitern, wenn der Wert von ?1 zur Ausführungszeit mehr als 255 Zeichen umfasst.
- Die Zuordnung eines numerischen CMP-Typs zu einer Spalte eines nicht verwandten Typs kann zu unvorhersehbaren Ergebnissen führen. Nehmen wir beispielsweise an, ein numerischer Typ Int soll einer Spalte vom Typ Decimal zugeordnet werden (5,2). Bei diesem Szenario bleibt während der Übertragung von der Datenbank zum CMP-Feld der Enterprise-Bean und zurück zur Datenbank kein exakter Dezimalwert erhalten (z. B. der Wert 12,25). Bei dieser Zuordnung wird der Ausgangswert durch eine ganze Zahl ersetzt (in diesem Fall 12). Das CMP-Feld sollte daher in Vergleichsoperationen vermieden werden, sofern es auf diese Art zugeordnet ist.
- Einige Datenbanken bieten keine Unterstützung für einen Datentyp, der der Semantik von java.sql.Time entspricht. Beispiel: Wenn ein CMP-Feld des Typs java.sql.Time einer Oracle-Spalte DATE zugeordnet ist, führen Zeitvergleiche ggf. nicht zum gewünschten Ergebnis, weil der Abschnitt year-month-day des Spaltenwertes in der Zuordnung abgeschnitten wird.
- Einige Datenbanken behandeln einen Zeichenfolgewert mit der Länge null ( '' ) als Nullwert. Dieses Verhalten kann sich auf die Abfrageergebnisse auswirken. Aus Gründen der Portierbarkeit sollten Sie die Verwendung von Zeichenfolgewerten mit der Länge null vermeiden.
- Einige Datenbanken verwenden für die Divisionen zweier ganzzahliger Werte arithmetischen Regeln für Integer und andere verwenden Regeln für nicht ganzzahlige Werte. Diese Diskrepanz könnte in Umgebungen mit beiden Datenbanktypen unerwünscht sein. Im Hinblick auf die Portierbarkeit sollten Sie die Division von ganzzahligen Werten in EJB-Abfragen vermeiden.
Aktuelle Releases von UDB DB2 for IBM i unterstützen nur einen TIMESTAMP-Wert des Formats "jjjj-mm-tt-hh.mm.ss.nnnnnn". Dieses Format ist nicht mit dem von der Klasse java.sql.Timestamp unterstützten Standardformat "jjjj-mm-tt-hh mm.ss.nnnnnn" kompatibel. Sie sollten die Skalarfunktion TIMESTAMP verwenden, um die Zeichenfolgedarstellung eines Objekts vom Typ java.sql.Timestamp in einen Wert zu konvertieren, der von DB2 UDB for IBM i erkannt werden kann.