API für dynamische Abfrage: Methoden prepareQuery() und executePlan()
Nutzen Sie die folgenden Methoden, um für den mit dynamischen Abfragen verbundenen Systemaufwand effizient Ressourcen zu reservieren. Diese Methoden entsprechen funktional den Methoden prepareStatement() und executeQuery() der JDBC-API.
Zwecks Ausführung einer dynamischen EJB-Abfrage (Enterprise JavaBeans) muss der Anwendungsserver die Abfragezeichenfolge zur Laufzeit in SQL (Structured Query Language) parsen. Selbstverständlich können Sie den Systemaufwand in der Laufzeit vermeiden, indem Sie an Stelle einer dynamischen Abfrage eine Standard-EJB-Abfrage ausführen. Standardabfragen oder auch Deployment-Abfragen werden bei der Implementierung syntaktisch analysiert und anschließend von einer Finder- oder Select-Methode ausgeführt.
Eine weitere Option ist das Schreiben von Code, mit dem der Systemaufwand einer dynamischen Abfrage umverteilt wird, um den Anwendungsdurchsatz zu verbessern. Rufen Sie dazu zunächst die Methode prepareQuery() an Stelle der Methode executeQuery() auf. Die Methode prepareQuery() analysiert Ihre Abfrage, setzt sie um und gibt dann eine Zeichenfolge zurück, die als Abfrageplan bezeichnet wird. Der Plan enthält die von der Syntaxanalyse und Umsetzung erzeugte SQL-Anweisung sowie weitere Informationen, die für die API für dynamische Abfragen erforderlich sind. Speichern Sie diese Zeichenfolge in Ihrer Anwendung, und rufen Sie die Methode executePlan() mit der Zeichenfolge auf, um die Abfrage auszuführen. (Sie können auch die Methode prepareQuery() verwenden, um das Ergebnis der SQL-Umsetzung zu sehen. Dazu müssen Sie einfach die Methode aufrufen und den Rückgabewert anzeigen.)
Übergeben Sie die Parameter Ihrer Abfrage als ein Array vom Typ Object an die Methodenaufrufe prepareQuery() und executePlan(). Vergewissern Sie sich, dass korrekte Datentypen übergeben werden. Der Anwendungsserver wertet Ihre Abfrage nämlich nach Parametertyp (und nicht nach den tatsächlichen Werten) aus, wenn er den Methodenaufruf prepareQuery() verarbeitet.
Beispielcode
select e.name as name, object(e) as emp from EmpBean e where e.salary < 50000
Der zweite
Aufruf führt eine Abfrage aus, die funktional äquivalent zur folgenden Anweisung ist: select e.name as name, object(e) as emp from EmpBean e where e.salary < 60000
Beispiel:
String query =
select e.name as name , object(e) as emp from EmpBean e where e.salary < ?1;
QueryIterator it = null;
Integer[] parms = new Integer[1];
parms[0] = new Integer(0);
Übergeben Sie im Aufruf von prepareQuery() einen ganzzahligen Wert. Damit wird ?1 wie im folgenden Beispiel als Typ Integer definiert:
String queryPlan= qb.prepareQuery(query, parms, null );
parms[0] = new Integer(50000);
Führen Sie nun die Abfrage aus, indem Sie ?1 durch den realen Wert Integer(50000) ersetzen:
select e.name as name, object(e) as emp from EmpBean e where e.salary < 50000it = qb.executePlan( queryPlan, parms, 0, 99);
parms[0] = new Integer(60000);
Führen Sie die Abfrage erneut aus. Ersetzen Sie diesmal ?1 durch den neuen Wert Integer(60000):
it = qb.executePlan( queryPlan, parms, 0, 99);