MokaByte Numero 34  - Ottobre  99
 
Accedere al database
DB2/400 con Java





 

di
Martino
Pezzoli
Presentazione di un esempio completo per accedere 
a tabelle DB2/400 tramite Java


Con il rilascio della versione 4 del sistema operativo OS/400 l' IBM ha incluso gratuitamente nei CD di installazione alcuni prodotti per l'utilizzo delle funzionalità AS/400 attraverso classi Java. In questo articolo vedremo cosa fare per disporre di queste nuove funzionalità e, in particolare, vedremo un esempio semplice ma completo di accesso a tabelle DB2/400


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 .


  
 

MokaByte rivista web su Java

MokaByte ricerca nuovi collaboratori
Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it