![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[z/OS]](../images/ngzos.gif)
Vergleich der Services für dynamische Abfragen und der Services für Implementierungs-EJB-Abfragen
Sie können den dynamischen Abfrageservice verwenden, um Abfragen für Entity-Beans, die dynamisch zur Laufzeit erstellt werden, zu erstellen und auszuführen, anstatt sie während der Implementierung zu definieren. Durch diese Verfahren erhalten Sie die Flexibilität von Abfragen, die zur Laufzeit definiert werden, und können das Leistungsspektrum von EJB-QL (Query Language) nutzen. Neben der Unterstützung des gesamten Leistungsspektrums von EJB-QL-Abfragen, stellt Ihnen der dynamische Abfrageservice weitere Funktionen zur Verfügung, die für die statischen Standardabfragen nicht bereitstehen. Zwei Beispiele hierfür sind die direkte Auswahl mehrerer Datenfelder in der Bean (statische Abfragen lassen derzeit nur die Auswahl eines Feldes zu) und die direkte Ausführung von Geschäftsmethoden in der Abfrage.
Mit dem dynamischen Abfrageservice können Sie auf einfache Weise effizientere und weniger ressourcenintensive Anwendungen erstellen. Beispielsweise werden zwei Datenfelder aus den Ergebnissen einer Abfrage benötigt. Weil eine EJB-QL-Standardabfrage nur ein Datenfeld auswählen kann, muss das gesamte EJB-Objekt ausgewählt werden. Anschließend müssen die erforderlichen Daten mit Datenzugriffsmethoden - unter Umständen durch Überschreiten der CMR-Grenzen (Container Managed Relationships) im Prozess - aus den zurückgegebenen Ergebnissen extrahiert werden. Wenn Sie jedoch den dynamischen Abfrageservice verwenden, erhalten Sie die gewünschten Daten direkt von der Abfrage, ohne CMR-Grenzen überschreiten oder Accessor-Methoden verwenden zu müssen. Dies ist das Prinzip, anhand dessen Sie prüfen müssen, ob die dynamische Abfrage eingesetzt werden kann, um Leistungsverbesserungen zu erzielen. Dabei sollten Sie prüfen, welche Datenmengen abgerufen werden müssen und welche Geschäftslogik dazu erforderlich ist, z. B. Überschreitung von CMR-Grenzen oder Accessor-Methoden.
Ein weiterer Aspekt, den Sie zur Leistungsverbesserung erwägen sollten, ist die Verwendung von Parametern in der Abfrage anstelle von Literalwerten. In den meisten Situationen ist es besser, bedingte Werte in der Abfrage als Parameter zu definieren und diese Parameter anschließend über die geeigneten Methoden zu übergeben. Dadurch erhöhen sich die Chancen, dass ein passender Plan für die Abfrage im Cache gefunden wird. Außerdem vermeiden Sie auf diese Weise, den Plan jedes Mal von Neuem syntaktisch analysieren und erstellen zu müssen. Beispielsweise lässt sich "SELECT Object(o) FROM schemaname AS o WHERE o.fieldname LIKE foo" besser als "SELECT Object(o) FROM schemaname AS o WHERE o.fieldname LIKE ?1" ausdrücken. Dabei wird der Wert "foo" als Parameter in der Methode executeQuery übergeben. Daher wird jede nachfolgende Ausführung einer dynamischen Abfragestruktur, die mit Ausnahme der Literalbedingungen für Zeichenfolgen mit dieser Abfrage übereinstimmt, als Cachetreffer in Bezug auf den Plan betrachtet. Dies verbessert die Leistung erheblich.
Wenn Sie eine dynamische Abfrage als direkten Ersatz für eine äquivalente statische Abfrage verwenden, ist diese um ca. 25 % langsamer als die statische Variante. Die längere Ausführung dynamischer Abfragen ist darauf zurückzuführen, dass zusätzlich zur Ausführung der Abfrage eine Syntaxanalyse durchgeführt und ein Plan für die Abfrage erstellt werden muss. Bei der statischen Variante fallen die Kosten während der Implementierung an. Trotz dieser Nachteile, bietet die zusätzliche Funktionalität, die aufgrund der dynamischen Abfrage zur Verfügung steht, und insbesondere die Fähigkeit, mehrere Datenfelder CMR-übergreifend in einer einzigen Abfrage auszuwählen, die Möglichkeit, die dynamische Abfrage zur Leistungsverbesserung einzusetzen.