21
1 Programmi Java e server AS400 (IBM i) Franco Lombardo [email protected] Molteni Informatica - Lecco

Java per as400

Embed Size (px)

DESCRIPTION

La presentazione mostra trucchi per integrare Java ed AS400 (IBM -i) con un occhio particolare all'uso del driver JDBC dell'IBM Tolbox for Java

Citation preview

Page 1: Java per as400

1

Programmi Java e server AS400 (IBM i)

Franco [email protected]

Molteni Informatica - Lecco

Page 2: Java per as400

2

IBM Developer Kit for JavaDriver JDBC locale Classe com.ibm.db2.jdbc.app.DB2Driver URL jdbc:db2://NomeDB dove NomeDB è una

voce di WRKRDBDIRE (posso utilizzare jdbc:db2://*local

/QIBM/ProdData/OS400/Java400/ext/db2_classes.jar

Si aggancia ad un lavoro server di preavvio nnnnn/QUSER/QSQSRV Lavora per conto del profilo utente di logon, ma non

assume la JOBD legata a tale profilo, e non richiama neppure eventuali programmi iniziali: attenzione alla lista librerie! (Mantenuta libreria corrente)

Page 3: Java per as400

3

IBM Toolbox for Java

Libreria 100% pure Java per accedere a risorse AS400

Utilizzabile sia su client, sia su AS400 Contiene (tra le altre cose)

Driver JDBC Classi per richiamo programmi, accesso a code

dati, profili utente, stampe, messaggi, job, aree dati, IFS, valori di sistema, stato del sistema...

Classi di utilità (es. table model Swing bufferizzato “MS Access”-like, JarMaker per estrarre sottoinsiemi di classi da un Jar)

Page 4: Java per as400

4

IBM Toolbox for JavaDove trovarlo Installato su AS400 come programma su licenza

(gratuito) nell’IFS /QIBM/ProdData/HTTP/Public/jt400/lib/jt400.jar

Installato a richiesta con Client Access (i-Series Access) C:\Programmi\IBM\Client Access\jt400\lib\jt400.jar

Scaricabile gratuitamente da internet nella sua versione open-source (JTOpen). E’ sempre la versione più aggiornata, che consiglio di usare.

Sul server AS400 richiede l’installazione e l’avvio degli Host Servers

Page 5: Java per as400

5

Driver di tipo 4 Classe com.ibm.as400.access.AS400JDBCDriver URL jdbc:as400://nomeOIpAs[/libreria]

[;listaProprietà]

Si appoggia allo stesso demone di sistema utilizzato da ODBC: QZDASRVSD Avviato con STRHOSTSVR *DATABASE In ascolto su porta TCP 8471 Associa ad ogni client un lavoro di preavvio

nnnnnn/QUSER/QZDASOINIT

IBM Toolbox for JavaJDBC

Page 6: Java per as400

6

IBM Toolbox for JavaJDBC: QZDASOINIT E’ utile abbassare la priorità di default di tale lavoro

e regolare il numero di lavori avviati automaticamente CRTCLS CLS(ODBC) RUNPTY(25) TIMESLICE(3000)

CHGPJE SBSD(QUSRWRK) PGM(QZDASOINIT) INLJOBS(20) THRESHOLD(15) ADLJOBS(5) CLS(ODBC) Esempio per avviare automaticamente 20 lavori,

aggiungerne automaticamente 5 quando ne sono in esecuzione meno di 15 ed avviarli a priorità 25 (più veloci dei batch e più lenti degli interattivi)

Su V4Rx il sottosistema è QSERVER

Page 7: Java per as400

7

IBM Toolbox for JavaJDBC: properties Impostabili anche nell’URL, per esempio:jdbc:as400://myAS;trace=true;user=pino;password=x;

Vediamone alcune transaction isolation gestione transazioni.

Se i file non sono sotto giornale, occorre impostare il valore none, che non è il default!

server trace gestione log su AS400. Valore 4: avvia STRDBG per QZDASOINIT, che

registra anche suggerimenti per costruzione indici. Valore 8: salva JOBLOG per QZDASOINIT.

Page 8: Java per as400

8

IBM Toolbox for JavaJDBC: properties

trace gestione ordinamento/ricerche. Valore true: stampa sullo standard output del client

la registrazione dettagliate di tutte le chiamate JDBC. Forte scadimento delle prestazioni: solo per debug.

sort gestione ordinamento/ricerche. Valore language: effettua ricerche/ordinamenti in

base alla lingua specificata nella proprietà sort language (per noi ITA).

Impostando tale valore è possibile effettuare ricerche non case-sensitive (sul modello MS SQLServer).

Possibile scadimento delle prestazioni.

Page 9: Java per as400

9

IBM Toolbox for JavaJDBC: Exit programs E’ possibile eseguire un programma su AS400

Al collegamento di ogni client Punto di uscita QIBM_QZDA_INIT

Prima dell’esecuzione di ogni statement SQL Punto di uscita QIBM_QZDA_SQL1

Tali programmi ricevono in ingresso i dati della richiesta (profilo utente, statement SQL...) e restituiscono un flag che indica se accettarla.

Gestiti con il comando WRKREGINF

Page 10: Java per as400

10

IBM Toolbox for JavaJDBC: Exit programs Un esempio CL per il controllo del collegamento PGM PARM(&STATUS &REQUEST)

/* Flag di accettazione/rifiuto richiesta */

DCL VAR(&STATUS) TYPE(*CHAR) LEN(1)

/* Parametro di ingresso contenente anche il nome utente */

DCL VAR(&REQUEST) TYPE(*CHAR) LEN(2000)

DCL VAR(&UTENTE) TYPE(*CHAR) LEN(10)

/* Di default rifiuto tutte le connessioni */

CHGVAR VAR(&STATUS) VALUE('0')

/* Recupero nome utente */

CHGVAR VAR(&UTENTE) VALUE(%SST(&REQUEST 1 10))

/* Abilito solo le connessioni di FRANCO */

IF COND(&UTENTE *EQ 'FRANCO') THEN(CHGVAR +

VAR(&STATUS) VALUE('1'))

ENDPGM

Per attivare il programmaADDEXITPGM EXITPNT(QIBM_QZDA_INIT) FORMAT(ZDAI0100) PGMNBR(1) PGM(LIB/PGM)

(Tutti i pgm QZDASOINIT in esecuzione devono essere riavviati)

Page 11: Java per as400

11

IBM Toolbox for JavaJDBC: chiamata programmi E’ possibile richiamare un qualsiasi programma

AS400 da una connessione JDBC utilizzando lo statement SQL CALL

Se non si devono ricevere dei parametri di ritorno dal programma, non è necessario creare anticipatamente una definizione di Stored procedure

Altrimenti occorre prima definire la procedura con lo statement SQL CREATE PROCEDURE

Page 12: Java per as400

12

IBM Toolbox for JavaJDBC: chiamata programmi Esempio di chiamata a programma senza

restituzione parametri: il programma chiamato…

PGM PARM(&FILE &LIB)

DCL VAR(&FILE) TYPE(*CHAR) LEN(10)

DCL VAR(&LIB) TYPE(*CHAR) LEN(10)

CPYF FROMFILE(&LIB/&FILE) TOFILE(QSYSPRT)

ENDPGM

Page 13: Java per as400

13

IBM Toolbox for JavaJDBC: chiamata programmi …ed il programma chiamante try { Class.forName("com.ibm.as400.access.AS400JDBCDriver");

Connection c = DriverManager.getConnection(

"jdbc:as400://AS400;user=PIPPO;password=X");

Statement s = c.createStatement();

s.execute(

"CALL MYLIB.MYPGM ('NOMEFILE ', 'NOMELIB ')");

} catch (Exception e) {}

Fate attenzione agli spazi nei parametri stringa: devono riempire la capacità della variabile (nell'esempio 10 caratteri)

Page 14: Java per as400

14

IBM Toolbox for JavaJDBC: chiamata programmi Esempio di chiamata a programma con

restituzione parametri: il programma chiamato… PGM PARM(&INGR &USC)

DCL VAR(&INGR) TYPE(*CHAR) LEN(10)

DCL VAR(&USC) TYPE(*CHAR) LEN(2)

CHGVAR VAR(&USC) VALUE('KO')

IF COND(&INGR *EQ 'FRANCO') THEN(CHGVAR +

VAR(&USC) VALUE('OK'))

ENDPGM

Lo statement SQL di creazione proceduraCREATE PROCEDURE MYLIB.MYPGM2(IN INGR CHAR (10 ), OUT USC CHAR

(2 )) LANGUAGE CL NOT DETERMINISTIC CONTAINS SQL EXTERNAL

PARAMETER STYLE GENERAL

Page 15: Java per as400

15

IBM Toolbox for JavaJDBC: chiamata programmi …ed il programma chiamante try {

Class.forName("com.ibm.as400.access.AS400JDBCDriver");

Connection c = DriverManager.getConnection(

"jdbc:as400://AS400;user=PIPPO;password=X");

CallableStatement cs =

c.prepareCall("CALL MYLIB.MYPGM2 (?, ?)");

cs.registerOutParameter(2, Types.CHAR);

cs.setString(1, "FRANCO");

cs.executeUpdate();

System.out.println("Risultato: " + cs.getObject(2));

} catch (Exception e) {}

Page 16: Java per as400

16

IBM Toolbox for JavaJDBC: esecuzione comandi Come eseguire un comando?

Con il programma di sistema qcmdexc, che ha come primo parametro un comando e come secondo la lunghezza del primo parametro

try {

Class.forName("com.ibm.as400.access.AS400JDBCDriver");

Connection c = DriverManager.getConnection(

"jdbc:as400://AS400;user=PIPPO;password=X");

CallableStatement cs =

c.prepareCall("CALL qsys.qcmdexc (?, ?)"); String cmd = "CHGJOB RUNPTY(15)";

cs.setString(1, cmd);

cs.setObject(2, new Integer(cmd.length()));

cs.execute();

} catch (Exception e) {}

Page 17: Java per as400

17

IBM Toolbox for JavaJDBC: esecuzione comandi Utilizzando l'interfaccia CallableStatement,

occorre prima creare la definizione di stored procedure con:

CREATE PROCEDURE QSYS.QCMDEXC(IN CMD VARCHAR(1024),

IN CMDLEN DECIMAL(15, 5)) EXTERNAL NAME QSYS.QCMDEXC LANGUAGE C GENERAL

Page 18: Java per as400

18

IBM Toolbox for JavaJDBC: esecuzione comandi L'esempio precedente potrebbe essere

realizzato anche senza l'utilizzo di CallableStatement:

try { Class.forName("com.ibm.as400.access.AS400JDBCDriver");

Connection c = DriverManager.getConnection(

"jdbc:as400://AS400;user=PIPPO;password=X");

Statement s = c.createStatement();

s.execute(

"call qsys.qcmdexc('CHGJOB RUNPTY(15)',000000017.00000)");

} catch (Exception e) {}

Page 19: Java per as400

19

IBM Toolbox for JavaJDBC: esecuzione comandi Nell'esempio precedente abbiamo modificato la

priorità del lavoro JDBC che serve le nostre chiamate. Questo può essere fatto solo se il profilo utente di collegamento ha l'autorizzazione speciale *JOBCTL

Page 20: Java per as400

20

IBM Toolbox for JavaJDBC Come scambiare grosse quantità di dati?

Tramite file nella libreria QTEMP: libreria "virtuale" di cui esiste una istanza per ogni lavoro. I file creati in tale libreria sono visibili solo dal lavoro corrente e vengono cancellati automaticamente alla fine del lavoro stesso.

Tramite file normali, magari indicizzati dal numero di lavoro, reperibile come nell'esempio iniziale (ricordarsi di riorganizzare con RGZPFM)

Page 21: Java per as400

21

IBM Toolbox for JavaJDBC Come estrarre un sottoinsieme di classi dal

Toolbox (es. JDBC)? Con la classe AS400ToolboxJarMaker (solo

JTOpen):java -cp jt400.jar utilities.AS400ToolboxJarMaker

-component JDBC -ccsid 1144

estrae le classi necessarie al dirver JDBC per la code-page italiana con simbolo euro (1144)

Estensione di JarMaker: classe di JTOpen per l’estrazione da file Jar dell’insieme minimo di classi necessarie per l’esecuzione di una classe.