SQLJ-Anwendungen implementieren
Mit Structured Query Language for Java™ Enterprise Edition (SQLJ) können Sie Datenzugriffsanwendungen entwickeln, die eine Verbindung zu DB2®-Datenbanken herstellen. SQLJ ist eine Gruppe von Programmiererweiterungen, die Ihnen ermöglichen, die Programmiersprache Java für das Einbetten von Anweisungen, die SQL-Datenbankanforderungen (Structured Query Language) bereitstellen, zu verwenden.
Informationen zu diesem Vorgang
Die Verwendung von SQLJ in Ihrer Anwendung hat die folgenden Vorteile gegenüber der
Alternative JDBC:
- SQLJ kann die Leistung verbessern, wenn Sie die DB2-Anpassungs- und -Bindungsschritte verwenden.
- SQLJ ermöglicht Anwendungen die Ausführung statischer SQL, sodass Sie differenzierte Sicherheitsrichtlinien wie Berechtigungen auf Paketebene anstelle der von JDBC angebotenen SQL verwenden können.
Vorgehensweise
- Erstellen Sie eine .sqlj-Datei, um Datenbankoperationen für Ihre Anwendung auszuführen.
import java.sql.*; import javax.sql.*; import java.util.*; import javax.naming.; import sqlj.runtime.*; #sql context MyCtx; #sql iterator MyIter(String name); public class MyDB2SQLJProcedure { public static void myProcedure() throws Exception { DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/myDS"); Connection con = ds.getConnection(); con.setAutoCommit(false); MyCtx ctx = new MyCtx(con); try { // Daten in die Tabelle 'mytable' einfügen. // Beachten, dass die Java-Variablen 'key' und 'val' ersetzt werden. int key = 1; String val = "one"; #sql [ctx] { INSERT into mytable VALUES (:key, :val) }; #sql [ctx] { COMMIT }; MyIter iter; #sql [ctx] iter = { SELECT name FROM mytable WHERE id=1 }; iter.next(); System.out.println("Found value: " + iter.name()); iter.close(); #sql [ctx] { COMMIT }; } finally { con.setAutoCommit(true); // When SQLJ performs transactional operations during context close, it assumes autocommit is true ctx.close(); } } }
- Fordern Sie die erforderlichen Treiber für die Transformation von SQLJ-Dateien an und transformieren Sie .sqlj-Dateien in
.java-Dateien. Sie können den zusätzlichen Parameter -db2optimize angeben, um DB2-spezifische Transformationen durchzuführen, was die Leistung verbessern kann.
java -cp .:/sqlj/sqlj4.zip:/sqlj/db2jcc4.jar sqlj.tools.Sqlj -C-classpath=/sqlj/sqlj4.zip:/sqlj/db2jcc4.jar -db2optimize MyDB2SQLJProcedure.sqlj
Wenn Sie diesen Befehl ausführen, erhalten Sie die folgenden Ausgabedateien:- MyDB2SQLJProcedure.class
- MyDB2SQLJProcedure.java
- MyDB2SQLJProcedure_SJProfile0.ser
- MyDB2SQLJProcedure_SJProfileKeys.class
- MyCtx.class
- MyIter.class
- Optional: Führen Sie das DB2-Tool für SQLJ-Anpassung aus, um die zuvor generierten
.ser-Dateien anzupassen und zu binden und um statische SQL in der Datenbank zu erstellen, die
DB2 zur Laufzeit verwendet. In der Anpassungsphase werden vier Datenbankpakete erstellt, die für jede Isolationsstufe die jeweilige statische
SQL enthalten.
java com.ibm.db2.jcc.sqlj.Customizer -url JDBC-URL -user BENUTZERNAME -password KENNWORT [-rootpkgname PAKETNAME] SERIALISIERTES_PROFILE1 SERIALISIERTES_PROFILE2...
Erläuterungen:Beispielsyntax:- JDBC-URL steht für die JDBC-URL, die für den Zugriff auf das DB2-System verwendet wird, auf dem sich Ihre Tabellen befinden. Die URL hat die folgende Syntax: jdbc:db2://Hostname:Port/Datenbankname
- BENUTZERNAME steht für einen gültigen Benutzernamen für das DB2-System, auf dem sich Ihre Tabellen befinden.
- KENNWORT steht für das Kennwort für den angegebenen Benutzernamen.
- PAKETNAME steht für den Namen eines gültigen PDS-Members (Partitioned Data Set, partitionierte Datei). Der Name kann bis zu sieben Zeichen lang sein. Jedes der vier Pakete, die von der Profilanpassungsfunktion erstellt werden, beginnen mit diesem Namen, an den eine Zahl von 1 bis 4 angefügt wird. Wenn Sie nur ein einziges serialisiertes Profil anpassen, ist dieser Wert standardmäßig eine gekürzte Version des serialisierten Profilnamens und der Parameter -rootpkgname ist nicht erforderlich. Wenn Sie mehrere serialisierte Profile mit demselben Befehl anpassen, gibt es keinen Standardwert und der Parameter -rootpkgname ist erforderlich.
- SERIALISIERTES_PROFILE1 steht für den Namen des serialisierten Profils, das Sie anpassen.
- Wenn Sie mehrere serialisierte Profile mit demselben Befehl anpassen möchten, verwenden Sie dazu eine durch Leerzeichen getrennte Liste mit Dateinamen.
- Alternativ können Sie den Parameter -rootpkgname angeben, um mehrere serialisierte Profile mit demselben Befehl anzupassen.
java -cp .:/sqlj/sqlj4.zip:/sqlj/db2jcc4.jar com.ibm.db2.jcc.sqlj.Customizer -url jdbc:db2://localhost:50000/mydb -user dbuser1 -passworddbpass1 MyDB2SQLJProcedure_SJProfile0.ser
Beispielausgabe:[jcc][sqlj] Begin Customization [jcc][sqlj] Loading profile: MyDB2SQLJProcedure_SJProfile0 [jcc][sqlj] Customization complete for profile MyDB2SQLJProcedure_SJProfile0.ser [jcc][sqlj] Begin Bind [jcc][sqlj] Loading profile:MyDB2SQLJProcedure_SJProfile0 [jcc][sqlj] Driver defaults(user may override): BLOCKING ALL VALIDATE BIND STATICREADONLY YES [jcc][sqlj] Fixed driver options: DATETIME ISO DYNAMICRULES BIND [jcc][sqlj] Binding package DB2SQL01 atisolation level UR [jcc][sqlj] Binding package DB2SQL02 at isolation level CS [jcc][sqlj] Binding package DB2SQL03 at isolation level RS [jcc][sqlj] Binding package DB2SQL04 at isolation level RR [jcc][sqlj] Bind complete for MyDB2SQLJProcedure_SJProfile0
- Aktualisieren Sie Ihr Anwendungsarchiv so, dass es alle Dateien enthält, die in Schritt 2 erstellt wurden.
Vergewissern Sie sich, dass die Verzeichnisstruktur, in der die Profile vorhanden sind, erhalten bleibt. Wenn die Klasse MyDB2SQLJProcedure beispielsweise den vollständig qualifizierten Namen
com.company.MyDB2SQLJProcedure hat, müssen die generierten Dateien in einem Ordner
com/company/ im entsprechenden Anwendungsmodul abgelegt werden.
Anmerkung: Die angepassten Dateien müssen an einer Position abgelegt werden, die zum Anwendungsklassenpfad gehört, und sie müssen in der JAR-Datei vor den serialisierten Profilen stehen, die nicht angepasst wurden. Wenn Sie die serialisierten Profile in Ihrer JAR-Datei ersetzen möchten, behalten Sie die Verzeichnisstruktur bei, in der die Profile vorhanden sind.
- Für Java EE-Anwendungen aktivieren Sie die erforderlichen Features,
definieren Sie eine Datenquellenkonfiguration und wenden Sie die erforderliche gemeinsam genutzte Bibliothek auf das Klassenladeprogramm Ihrer Anwendung an.
Das Feature jdbc-4.1 muss in der Datei
server.xml aktiviert werden, damit SQLJ verwendet wird. Wenn eine Datenquelle mit JNDI gefunden wird, muss auch
das Feature jndi-1.0 aktiviert sein. Sehen Sie sich hierzu das folgende Beispiel an:
<server> <featureManager> <feature>jdbc-4.1</feature> <feature>jndi-1.0</feature> </featureManager> <application location="myapp.war"> <classloader commonLibraryRef="DB2Lib"/> </application> <library id="DB2Lib"> <fileset dir="C:/DB2/java" includes="db2jcc4.jar db2jcc_license_cisuz.jar"/> </library> <dataSource id="myDS" jndiName="jdbc/myDS"> <jdbcDriver libraryRef="DB2Lib"/> <properties.db2.jcc databaseName="mydb" serverName="localhost" portNumber="50000" user="dbuser1" password="dbpass1"/> </dataSource> </server>
- Für OSGi-Anwendungen aktivieren Sie die Features jdbc-4.1 und wab-1.0 für die Verwendung Ihrer
OSGi-Anwendung. Wenn Ihre Anwendung JNDI verwendet, aktivieren Sie auch das Feature jndi-1.0. Erstellen Sie eine <osgiLibrary>, die auf Ihre
SQLJ-Bibliothek verweist. Konfigurieren Sie anschließend Ihre Anwendung so, dass sie auf die OSGi-Bibliothek verweist, die die erforderlichen
SQLJ-Pakete enthält. Im Folgenden sehen Sie ein Beispiel für die Datei server.xml:
<server> <featureManager> <feature>jdbc-4.1</feature> <feature>jndi-1.0</feature> <feature>wab-1.0</feature> </featureManager> <osgiApplication name="myapp" location="myapp.eba"/> <osgiLibrary libraryRef="DB2Lib"/> <library id="DB2Lib"> <fileset dir="C:/DB2/java" includes="db2jcc4.jar db2jcc_license_cisuz.jar"/> </library> <dataSource id="myDS" jndiName="jdbc/myDS"> <jdbcDriver libraryRef="DB2Lib"/> <properties.db2.jcc databaseName="mydb" serverName="localhost" portNumber="50000" user="dbuser1" password="dbpass1"/> </dataSource> </server>
Importieren Sie in die Datei MANIFEST.MF des Anwendungsmoduls für 'myapp' die erforderlichen SQLJ-Pakete, die mit dem Element <osgiLibrary> angegeben sind:Import-Package: javax.annotation, javax.sql, javax.naming, com.ibm.db2.jcc, com.ibm.db2.jcc.sqlj, sqlj.runtime, sqlj.runtime.error, sqlj.runtime.profile, sqlj.runtime.profile.ref, sqlj.runtime.profile.util, sqlj.runtime.ref, sqlj.runtime.util
- Sie können WebSphere Application Server Liberty einen DB2-SQLJ-Kontext mit jeder gepoolten Verbindung zwischenspeichern lassen. Das Caching von DB2-SQLJ-Kontexten kann zu einem Verhalten führen, das enger an WebSphere Application Server Traditional ausgerichtet ist, wie z. B. die Bereinigung von Ressourcen, die von der Anwendung nicht geschlossen werden. Das Caching kann auch zu Leistungsverbesserungen in SQLJ-Pfaden führen. Zum Aktivieren des Cachings von DB2-SQLJ-Kontexten müssen Sie die
Datenquelleneigenschaft enableConnectionCasting mit dem Wert true konfigurieren. Sehen Sie sich hierzu das folgende Beispiel an:
<dataSource id="myDS" jndiName="jdbc/myDS" enableConnectionCasting="true">
Übergeordnetes Thema: Datenzugriffsanwendungen in Liberty implementieren


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-libcore-mp&topic=twlp_deploy_sqlj
Dateiname: twlp_deploy_sqlj.html