Franco Lombardo [email protected] … · 2 IBM Developer Kit for Java Driver JDBC...

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

Transcript of Franco Lombardo [email protected] … · 2 IBM Developer Kit for Java Driver JDBC...

1

Programmi Java e server AS400 (IBM i)

Franco [email protected]

Molteni Informatica - Lecco

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 preavvionnnnn/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)

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)

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-SeriesAccess)� 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

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

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

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.

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à sortlanguage (per noi ITA ).

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

� Possibile scadimento delle prestazioni.

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

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 u tente */

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)

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 Storedprocedure

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

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

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)

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 ), O UT USC CHAR (2

)) LANGUAGE CL NOT DETERMINISTIC CONTAINS SQL EXTER NAL

PARAMETER STYLE GENERAL

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) {}

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) {}

17

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

occorre prima creare la definizione di storedprocedure con:

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

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

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.000 00)");

} catch (Exception e) {}

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

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)

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.