La prima operazione
da fare è installare, utilizzando la funzione 10 del menu LICPGM,
l'AS/400 Tool Box for Java (codice prodotto 5763jc1) e l'AS/400 Developer
Kit for Java (codice prodotto 5769jv1). Per chi avesse versioni precedenti
di sistema operativo consiglio di sentire il centro di supporto o
il proprio rappresentante perchè i prodotti sono a pagamento (minimo)
e richiedono specifiche PTF per funzionare correttamente.
A questo punto
è opportuno verificare il comulativo di PTF installato in macchina,
utilizzando il comando DSPPTF, applicarlo nuovamente affinchè anche
questi nuovi prodotti siano allo stesso livello; per testare che l'installazione
sia corretta eseguire da riga comandi su as/400 il comando java com.ibm.as400.system.Hello;
se verrà visualizzato il banale "Hello world" tutto è OK!
Per avere, sul
proprio pc, le classi da utilizzare per accedere al DB2/400 si deve estrarre
il file in formato .zip o in formato .jar dal file system dell' AS/400
utilizzando uno dei tanti modi disponibili (es. l' Operation Navigator
del client access, oppure l' FTP od altro).
Il file \\NomeAs400\QIBM\ProdData\HTTP\Public\jt400\lib\jt400.zip
contiene le classi del ToolBox per accedere remotamente (via lan) al DB2/400,
può essere utilizzato anche per accessi locali specificando come
hostname "localhost" nella connection() al sistema (sconsigliato); è
consigliabile utilizzare per gli accessi locali (classi Java che vengono
eseguite localmente su AS/400) il file del Dev. Kit \\NomeAs400\QIBM\ProdData\Java400\com\ibm\db2\jdbc\app\db2_classes.zip
, inoltre, per poter accedere localmente, è necessario configurare
una entrata nel Database Directory Entries (WRKRDBDIRE) specificando il
nome che verrà
utilizzato come
JDBC Driver (es. DB2) e *LOCAL nel parametro "ubicazione remota", gli altri
parametri non devono essere compilati.
Prerequisito
fondamentale affinchè tutto l'ambiente Java possa funzionare è
che il protocollo TCP/IP sia configurato su
AS/400; è
possibile farlo con una certa attenzione accedendo al menu seguente (GO
TCPADM).
Un consiglio
che posso dare a tutti i lettori è di scaricare dal sito internet
IBM di Rochester in USA http://www.as400.ibm.com/tstudio/java/v4r3frm.htm
la documentazione "AS/400 Java information" che, in modo esauriente, parla
del Toolbox for Java, del Developer Kit for Java e del QShell interpreter
che è la command interpreter basata sugli standards POSIX e X/Open
che IBM ha inserito nel sistema operativo OS/400.
Per consultare
la lista dei comandi messi a disposizione per utilizzare dei sorgenti Java
(es. compilarli od eseguirli) e sufficiente inserire GO CMDJVA dalla riga
comandi AS/400.
Penso sia opportuno
sottolineare che l'OS/400 dispone di un'opzione JIT molto potente, infatti
ogni classe viene compilata e memorizzata dal sistema operativo durante
il primo loading in modo che alla successiva chiamata la stessa classe
non debba più essere ricompilata; questo meccanismo funziona solo
per i file.class mentre se più classi sono compattate in un file
.zip o .jar la compilazione deve essere eseguita in modo esplicito, manualmente,
utilizzando il comando CRTJVAPGM.
Esempio pratico
A questo punto
l'ambiente è pronto per poter utilizzare classi Java per accedere
al DB2400, il primo sorgente mostrato è la
classe "driver"
che gestisce tutte le chiamate di tipo locale o remoto verso il DBMS.
/**
*
-----------------------------------------------------------------------------
*
*
AS400 - Classe Driver di accesso Remoto e Locale al DB2 AS/400
*
-----------------------------------------------------------------------------
*
*/
import
java.io.*;
import
java.sql.*;
import
com.ibm.as400.access.*; // package tollbox for Java
import
com.ibm.db2.jdbc.app.*; // package dev. kit for Java
public
class DB2Access {
static
Connection AScon
Statement
stmt;
ResultSet
rs;
ResultSetMetaData
rsmd;
String
hostname = new String("10.100.0.10"); // IP address per acccesso Remoto
String
db2name = new String("DB2"); // Nome indirizzario as400 (WRKRDBDIRE) per
accesso Locale
//
Se utente non è specificato verrà presentata automaticamente
una finestra con la richiesta utente
String
user = new String("QPGMR"); // nome utente AS400 di default
String
pwrd = new String("QPGMR"); // password utente AS400
AS400
ASname = new AS400(hostname);
/**
*
Costruttore per accesso Remoto (richiamato per default)
*/
public
DB2Access() {
//
Apre connessione con AS400 se necessario
try
{
if
((AScon == null) || (AScon.isClosed())) { // se la connection è
close >> open connessione
DriverManager.registerDriver(new
AS400JDBCDriver()); // registro il driver
AScon
= DriverManager.getConnection("jdbc:as400://" + ASname, user, pwrd); //
accesso remoto
}
}
catch (SQLException ex1) {
System.out.println
("SQLException : " + ex1.getMessage());
}
}
// end DB2Access()
/**
*
Costruttore per Accesso Locale (da specificare passando parametro char
"L")
*/
public
DB2Access(char local) {
//
Apre connessione con AS400 solo se necessario cioè se non aperta
già in precedenza
try
{
if
((AScon == null) || (AScon.isClosed())) { // se la connection è
close >> open connessione
DriverManager.registerDriver(new
DB2Driver()); // registro il driver
AScon
= DriverManager.getConnection("jdbc:db2://" + db2name, "", ""); // accesso
locale
}
}
catch (SQLException ex1) {
System.out.println
("SQLException : " + ex1.getMessage());
}
}
// end DB2Access()
/**
*
Esegue la query SQL - è richiesto la stringa della query e della
fonte dati
*/
public
void ExecStmt(String query) {
try
{
stmt
= AScon.createStatement(); // prepare dello statement
rs
= stmt.executeQuery(query); // esegue statment SQL e restituisce i dati
rsmd
= rs.getMetaData(); // recupera le caratteristiche dei campi estratti
}
catch(SQLException ex) {
System.out.println
("\n*** SQLException catturata ***\n");
while
(ex != null) {
System.out.println
("SQLState: " + ex.getSQLState ());
System.out.println
("Message: " + ex.getMessage ());
System.out.println
("Code: " + ex.getErrorCode ());
ex
= ex.getNextException ();
System.out.println
("");
}
}
}
// end ExecStmt()
/**
*
Chiusura statement accesso SQL
*/
public
void CloseStmt() {
//
Chiusura SQL
try
{
rs.close();
stmt.close();
}
catch (SQLException ex) {
System.out.println
("SQLException : " + ex.getMessage());
}
}
// end CloseStmt()
/**
*
Chiusura connessione verso DB2
*/
public
void CloseCon() {
//
Chiusura servizio AS400 per accesso a FILE
ASname.disconnectService(AS400.FILE);
// importante per non lasciare appeso il servizio
try
{
AScon.close();
}
catch (SQLException ex) {
System.out.println
("SQLException : " + ex.getMessage());
}
}
// end CloseCon()
}
// end Class DB2Access
Da evidenziare
l'overloading del costruttore attivato a seconda dei parametri passati
nella dichiarazione della classe (parametro L=locale, blank=remoto) e l'apertura
della connection che viene controllata ed è effettuata una sola
volta in modo da ottimizzare le performance di accesso; il resto del codice
dovrebbe essere comprensibile leggendo le note.
Il secondo sorgente serve solo ad
istanziare la classe "driver", comporre la query SQL da eseguire e mostrare
a video il contenuto di un file DB richiesto.
/**
*
-------------------------------------------------------------------------
*
*
DataBase access to DB2 to system as400
*
*
esempio di chiamata : java ReadDB R agfdev.qsmesrc
*
-------------------------------------------------------------------------
*
*/
import
java.io.*;
import
java.sql.*;
import
DB2Access.*;
public
class ReadDB2 {
public
static void main(String[] args) throws IOException {
DB2Access
aaa;
String
query;
char
car;
if
(args.length < 2)
System.out.println("Manca
TIPO ACCESSO (L/R) e/o nome/i LIBRERIA.FILE da visualizzare !!!");
else
{
query
= new String("SELECT * FROM " + args[1]);
if
((args[0].compareTo("L") == 0) || (args[0].compareTo("l") == 0))
aaa
= new DB2Access('L'); // accesso locale
else
aaa
= new DB2Access(); // accesso remoto
//
Visualizza risultato
aaa.ExecStmt(query);
try
{
int
numberOfColumns = aaa.rsmd.getColumnCount();
while
(aaa.rs.next()) {
//
estrazione dati riga distinta tavola
for
(int i = 1; i <= numberOfColumns; i++) {
System.out.print(aaa.rs.getString(i));
// visualizzazione brutale del contenuto del record del file DB richiesto
}
System.out.println();
}
}
catch(SQLException ex) {
System.err.println("SQLException:
" + ex.getMessage());
}
aaa.CloseStmt();
aaa.CloseCon();
}
}
}
// end Class
Conclusioni
Spero che questo
articolo possa essere di aiuto a molti per poter iniziare ad utilizzare
Java per programmare su as400 cercando di abbandonare, gradualmente s'intende,
i linguaggi tipici fino ad oggi utilizzati (RPG, COBOL); certo le performance
di Java su as400 non sono ancora paragonabili a quelle dei linguaggi tradizionali
ma e bene abituarsi e cominciare perchè, a mio avviso, in breve
tempo anche questo ostacolo verrà risolto ed allora si potrà
sfruttare a pieno tutta la potenzialità di questo linguaggio "rivoluzionario".
Bibliografia
[1] Mauro Molino,
"AS/400 ToolBox for Java", Dec. 1998.
[2] Michele
Sciabarrà, "AS/400 e Java primi passi di eCommerce", Mar. 1999.
[3] sito IBM
http://www.as400.ibm.com/tstudio/java
. |