Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (Deutsch) » SQL Anywhere Server - Programmierung » Unterstützung für externe Umgebungen in SQL Anywhere

 

Die externe Java-Umgebung

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). Es gibt eine Instanz der Java VM für jede Datenbank statt einer Instanz für jede Verbindung. 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:

  1. Eine Kopie der Java-Laufzeitumgebung muss auf dem Datenbankserversystem installiert sein.

  2. 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.7.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');

Die START EXTERNAL ENVIRONMENT JAVA-Anweisung wird nur benötigt, um zu überprüfen, ob der Datenbankserver die Java VM starten kann. 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;

Das Argument zu main wird als Array von java.lang.String beschrieben. 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;

Die Funktion whoAreYou gibt gemäß ihrer Beschreibung einen java.lang.String-Wert zurück. 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 Shared Objects sajdbc4.jar und dbjdbc16/libdbjdbc16 aus demselben Software-Build stammen.

  • Wenn sich auf dem Datenbankserver-Computer mehrere Kopien von sajdbc4.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 eines Timeouts gemeldet wird.

 Siehe auch