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 .
