SQL Anywhere stellt Unterstützung für gespeicherte Java-Prozeduren und -Funktionen bereit. Eine gespeicherte Java-Prozedur oder Funktion verhält sich wie eine gespeicherte SQL-Prozedur oder Funktion, abgesehen davon, dass der Code für die Prozedur oder Funktion in Java geschrieben ist und die Ausführung der Prozedur oder Funktion außerhalb des Datenbankservers stattfindet (d.h. in einer Java VM-Umgebung). Beachten Sie, dass es eine Instanz der Java VM für jede Datenbank statt einer Instanz für jede Verbindung gibt. Gespeicherte Java-Prozeduren können Ergebnismengen zurückgeben.
Es gibt einige Voraussetzungen für die Verwendung der Unterstützung für Java in der Datenbank:
Eine Kopie der Java-Laufzeitumgebung muss auf dem Datenbankserversystem installiert sein.
Der SQL Anywhere-Datenbankserver muss in der Lage sein, die Position des Java-Programms (der Java VM) zu ermitteln.
Um Java in der Datenbank zu verwenden, achten Sie darauf, dass der Datenbankserver in der Lage ist, das Java-Programm aufzufinden und zu starten. Sie überprüfen dies, indem Sie Folgendes ausführen:
START EXTERNAL ENVIRONMENT JAVA; |
Wenn der Datenbankserver Java nicht starten kann, liegt die Ursache des Problems wahrscheinlich darin, dass der Datenbankserver das Java-Programm nicht finden kann. In diesem Fall sollten Sie die Anweisung ALTER EXTERNAL ENVIRONMENT ausführen, um den Speicherort des Java-Programms explizit einzustellen. Achten Sie darauf, den Programmdateinamen einzubeziehen.
ALTER EXTERNAL ENVIRONMENT JAVA LOCATION 'java-path'; |
Beispiel:
ALTER EXTERNAL ENVIRONMENT JAVA LOCATION 'c:\\jdk1.6.0\\jre\\bin\\java.exe'; |
Sie können den Speicherort der Java VM abfragen, die der Datenbankserver verwenden wird, indem Sie die folgende SQL-Abfrage ausführen:
SELECT db_property('JAVAVM'); |
Beachten Sie, dass die Anweisung START EXTERNAL ENVIRONMENT JAVA nur benötigt wird, um zu überprüfen, ob der Datenbankserver in der Lage ist, die Java VM zu starten. Im Allgemeinen führt das Ausführen eines gespeicherten Java-Prozedur- oder -Funktionsaufrufs dazu, dass die Java VM automatisch gestartet wird.
Gleichermaßen ist die Anweisung STOP EXTERNAL ENVIRONMENT JAVA nicht erforderlich, um eine Instanz von Java zu stoppen, da die Instanz automatisch entfernt wird, wenn alle Verbindungen zur Datenbank beendet wurden. Wenn Sie allerdings die Arbeit mit Java vollständig abgeschlossen haben und einige Ressourcen freigeben wollen, vermindert die Anweisung STOP EXTERNAL ENVIRONMENT JAVA die Verwendungsanzahl für die Java VM.
Nachdem Sie überprüft haben, dass der Datenbankserver das Java VM-Programm starten kann, besteht der nächste Schritt darin, den erforderlichen Java-Klassencode in der Datenbank zu installieren. Sie erreichen dies, indem Sie die Anweisung INSTALL JAVA verwenden. Sie können beispielsweise die folgende Anweisung ausführen, um eine Java-Klasse von einer Datei in der Datenbank zu installieren.
INSTALL JAVA NEW FROM FILE 'java-class-file'; |
Sie können auch eine Java JAR-Datei in der Datenbank installieren.
INSTALL JAVA NEW JAR 'jar-name' FROM FILE 'jar-file'; |
Java-Klassen können wie folgt von einer Variablen installiert werden:
CREATE VARIABLE JavaClass LONG VARCHAR; SET JavaClass = xp_read_file('java-class-file') INSTALL JAVA NEW FROM JavaClass; |
Java JAR-Dateien können wie folgt von einer Variablen installiert werden:
CREATE VARIABLE JavaJar LONG VARCHAR; SET JavaJar = xp_read_file('jar-file') INSTALL JAVA NEW JAR 'jar-name' FROM JavaJar; |
Um eine Java-Klasse aus der Datenbank zu entfernen, verwenden Sie die Anweisung REMOVE JAVA:
REMOVE JAVA CLASS java-class |
Um eine Java JAR-Datei aus der Datenbank zu entfernen, verwenden Sie die Anweisung REMOVE JAVA:
REMOVE JAVA JAR 'jar-name' |
Um bestehende Java-Klassen zu ändern, können Sie die UPDATE-Klausel der Anweisung INSTALL JAVA verwenden:
INSTALL JAVA UPDATE FROM FILE 'java-class-file' |
Sie können auch bestehende Java JAR-Dateien in der Datenbank aktualisieren.
INSTALL JAVA UPDATE JAR 'jar-name' FROM FILE 'jar-file'; |
Java-Klassen können wie folgt von einer Variablen aktualisiert werden:
CREATE VARIABLE JavaClass LONG VARCHAR; SET JavaClass = xp_read_file('java-class-file') INSTALL JAVA UPDATE FROM JavaClass; |
Java JAR-Dateien können wie folgt von einer Variablen aktualisiert werden:
CREATE VARIABLE JavaJar LONG VARCHAR; SET JavaJar = xp_read_file('jar-file') INSTALL JAVA UPDATE FROM JavaJar; |
Nachdem die Java-Klasse in der Datenbank installiert ist, können Sie gespeicherte Prozeduren und Funktionen erstellen, um eine Schnittstelle zu den Java-Methoden herzustellen. Die Zeichenfolge der EXTERNAL NAME-Klausel enthält die erforderlichen Informationen, um die Java-Methode aufzurufen und um OUT-Parameter und Rückgabewerte zurückzugeben. Das LANGUAGE-Attribut der EXTERNAL NAME-Klausel muss JAVA angeben. Das Format der EXTERNAL NAME-Klausel ist folgendes:
EXTERNAL NAME 'java-call' LANGUAGE JAVA
java-call : [package-name.]class-name.method-name method-signature
method-signature :
( [ field-descriptor, ... ] ) return-descriptor
field-descriptor und return-descriptor : Z | B | S | I | J | F | D | C | V | [descriptor | Lclass-name;
Eine Java-Methodensignatur ist die kompakte Zeichendarstellung der Parametertypen und des Rückgabewerttyps. Wenn die Anzahl
der Parameter geringer ist als die in der Methodensignatur angegebene Zahl, muss die Differenz der in DYNAMIC RESULT SETS
angegebenen Zahl entsprechen. Jeder Parameter in der Methodensignatur, der nicht in der Parameterliste für die Prozedur enthalten
ist, muss die Methodensignatur [Ljava/sql/ResultSet;
haben.
Der Felddeskriptor (field-descriptor) und der Rückgabedeskriptor (return-descriptor) haben die folgenden Bedeutungen:
Feldtyp | Java-Datentyp |
---|---|
B | byte |
C | char |
D | double |
F | float |
I | int |
J | long |
L class-name; | Eine Instanz der Klasse class-name. Die Klasse muss voll qualifiziert sein und alle Punkte im Namen müssen durch das Zeichen / ersetzt werden. Beispiel: java/lang/String |
S | short |
V | void |
Z | Boolescher Wert |
[ | Verwenden Sie jeweils eine für jede Felddimension. |
Beispiel:
double some_method( boolean a, int b, java.math.BigDecimal c, byte [][] d, java.sql.ResultSet[] rs ) { } |
Dieses Beispiel hätte folgende Signatur:
'(ZILjava/math/BigDecimal;[[B[Ljava/sql/ResultSet;)D' |
Die folgende Prozedur erstellt eine Schnittstelle zu einer Java-Methode. Die Java-Methode gibt keinen Wert zurück (V).
CREATE PROCEDURE insertfix() EXTERNAL NAME 'JDBCExample.InsertFixed()V' LANGUAGE JAVA; |
Die folgende Prozedur erstellt eine Schnittstelle zu einer Java-Methode, die ein String-Eingabeargument ([Ljava/lang/String;) hat. Die Java-Methode gibt keinen Wert zurück (V).
CREATE PROCEDURE InvoiceMain( IN arg1 CHAR(50) ) EXTERNAL NAME 'Invoice.main([Ljava/lang/String;)V' LANGUAGE JAVA; |
Die folgende Prozedur erstellt eine Schnittstelle zu einer Java-Methode Invoice.init, die ein String-Argument (Ljava/lang/String;) übernimmt, sowie ein Double (D), ein weiteres String-Argument (Ljava/lang/String;) und ein weiteres Double (D), und die keinen Wert zurückgibt (V).
CREATE PROCEDURE init( IN arg1 CHAR(50), IN arg2 DOUBLE, IN arg3 CHAR(50), IN arg4 DOUBLE) EXTERNAL NAME 'Invoice.init(Ljava/lang/String;DLjava/lang/String;D)V' LANGUAGE JAVA |
Das folgende Java-Beispiel enthält die Funktion main
, die eine Zeichenfolge übernimmt und sie in das Meldungsfenster des Datenbankservers schreibt. Außerdem enthält es die Funktion
whoAreYou
, die eine Java-Zeichenfolge zurückgibt.
import java.io.*; public class Hello { public static void main( String[] args ) { System.out.print( "Hello" ); for ( int i = 0; i < args.length; i++ ) System.out.print( " " + args[i] ); System.out.println(); } public static String whoAreYou() { return( "I am SQL Anywhere." ); } } |
Der obenstehende Java-Code wird in die Datei Hello.java abgelegt und mit dem Java-Compiler kompiliert. Die resultierende Klassendatei wird folgendermaßen in die Datenbank geladen:
INSTALL JAVA NEW FROM FILE 'Hello.class'; |
Unter Verwendung von Interactive SQL wird die gespeicherte Prozedur, die eine Schnittstelle zur Methode main
in der Klasse Hello
herstellt, folgendermaßen erstellt:
CREATE PROCEDURE HelloDemo( IN name LONG VARCHAR ) EXTERNAL NAME 'Hello.main([Ljava/lang/String;)V' LANGUAGE JAVA; |
Beachten Sie, dass das Argument zu main
als Array von java.lang.String beschrieben wird. Unter Verwendung von Interactive SQL testen Sie die Schnittstelle, indem
Sie die folgende SQL-Anweisung ausführen.
CALL HelloDemo('SQL Anywhere'); |
Wenn Sie das Meldungsfenster des Datenbankservers überprüfen, werden Sie dort die Meldung angezeigt sehen. Die gesamte Ausgabe an System.out wird zum Fenster "Datenbankservermeldungen" umgeleitet.
Unter Verwendung von Interactive SQL wird die Funktion, die eine Schnittstelle zur Methode whoAreYou
in der Klasse Hello
herstellt, folgendermaßen erstellt:
CREATE FUNCTION WhoAreYou() RETURNS LONG VARCHAR EXTERNAL NAME 'Hello.whoAreYou(V)Ljava/lang/String;' LANGUAGE JAVA; |
Beachten Sie, dass die Funktion whoAreYou
gemäß ihrer Beschreibung einen java.lang.String-Wert zurückgibt. Unter Verwendung von Interactive SQL testen Sie die Schnittstelle,
indem Sie die folgende SQL-Anweisung ausführen.
SELECT WhoAreYou(); |
Sie sollten die Antwort im Interactive SQL-Fenster Ergebnisse sehen.
Bei dem Versuch einer Fehlerbehandlung für den Fall, dass eine externe Java-Umgebung nicht gestartet wurde (d.h. die Anwendung bei einem Java-Aufruf einen Fehler erhält, wonach der Haupt-Thread nicht gefunden wurde), sollte der DBA Folgendes überprüfen:
Wenn die Java VM einen anderen Bitwert aufweist als der Datenbankserver, sorgen Sie dafür, dass auf dem Datenbankserver-Computer die Clientbibliotheken mit demselben Bitwert wie die VM installiert werden.
Achten Sie darauf, dass die gemeinsam genutzten Objekte sajdbc.jar und dbjdbc12/libdbjdbc12 aus demselben Software-Build stammen.
Wenn sich auf dem Datenbankserver-Computer mehrere Kopien von sajdbc.jar befinden, sorgen Sie dafür, dass alle mit derselben Softwareversion synchronisiert werden.
Wenn der Datenbankserver-Computer stark ausgelastet ist, besteht die Möglichkeit, dass der Fehler aufgrund einer Zeitüberschreitung gemeldet wird.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |