Professional Documents
Culture Documents
wTul: http://www.wtul.com
21 de Marzo de 2008
1
Conexión a un AS/400 (iSeries) desde JDBC
Contenidos
Conexión a un AS/400 (iSeries) desde JDBC...................................................................................... 1
Los dos drivers que pueden hacer el trabajo....................................................................................3
DB2 Universal JDBC Driver...................................................................................................... 3
Ejemplo de conexión.............................................................................................................. 3
IBM ToolBox para Java.............................................................................................................. 4
Ejemplo de conexión.............................................................................................................. 4
Utilidad Ping...........................................................................................................................4
Prueba para insert into............................................................................................................ 5
Lugar oficial de desarrollo y descarga....................................................................................5
Documentación................................................................................................................................ 6
Preparación del AS/400................................................................................................................... 6
Requerimientos del AS/400 para funcionar con IBM Toolbox para java................................... 6
Acciones realizadas en el AS400 de wTul.................................................................................. 7
Problemas de conexión con el AS400..............................................................................................8
Configurando todo para trabajar desde Hibernate........................................................................... 9
hibernate.cfg.xml........................................................................................................................ 9
Problemas con Hibernate............................................................................................................ 9
Error SQL7008....................................................................................................................... 9
Intento de recrear el PreparedStatement desde JDBC..................................................... 10
Solución:.......................................................................................................................... 10
Activación de los diarios.............................................................................................10
Solución rápida:............................................................................................................... 11
Aplicación de prueba java-db2...................................................................................................... 11
Configuración y ejecución de los tests...................................................................................... 11
Configuración y despliegue de la aplicación web.....................................................................12
Aplicación de pruebas online.................................................................................................... 13
Conclusiones.................................................................................................................................. 14
2
Conexión a un AS/400 (iSeries) desde JDBC
Con este driver no he tenido problemas para conectar a una Base de Datos DB2 corriendo
en un servidor Linux.
Pero para conectar a un AS/400 este driver requiere un fichero de licencia que nos ha
resultado imposible encontrar.
El error:
Ejemplo de conexión
3
Conexión a un AS/400 (iSeries) desde JDBC
Es el recomendado de IBM.
Ejemplo de conexión
Utilidad Ping
Este Driver tiene una curiosa utilidad para comprobar si en la ip que le indicas hay un
AS/400 con su DB2 escuchando:
public Connection ToolBoxPing(
String ipServer
) throws SQLException{
AS400JPing pingObj = new AS400JPing( IpServer , AS400.COMMAND, false);
if (pingObj.ping()) {
System.out.println("SUCCESS");
} else {
System.out.println("FAILED");
}
}
//
// cargamos hash con todos los servicios a ejecutar.
//
HashMap<String , Integer> servicios = new HashMap<String, Integer>();
4
Conexión a un AS/400 (iSeries) desde JDBC
//
// iniciamos objeto AS400Ping
//
AS400JPing pingObj = new AS400JPing( ipServer );
//
// ejecuto pings
//
Set<String> keys = servicios.keySet();
for (Iterator iter = keys.iterator(); iter.hasNext(); ) {
String key = (String) iter.next();
int servicio = servicios.get( key ).intValue();
if (pingObj.ping( servicio )) {
System.out.println( key + ":SUCCESS");
} else {
System.out.println( key + ":FAILED" );
}
}
}
String sql =
"insert into MESSAGES ( MESSAGE_ID, MESSAGE_TEXT ) values
( default, '" + text + "' )";
Statement s = connection.createStatement();
s.execute( sql );
s.close();
}
http://jt400.sourceforge.net/
5
Conexión a un AS/400 (iSeries) desde JDBC
Documentación
● Sitio oficial de IBM ToolBox para Java:
http://www-03.ibm.com/systems/i/software/toolbox/index.html
Requerimientos del AS/400 para funcionar con IBM Toolbox para java
http://publib.boulder.ibm.com/iseries/v5r1/ic2924/index.htm?info/rzahh/rzahnm05.htm
6
Conexión a un AS/400 (iSeries) desde JDBC
The OS/400 database host server is not started. You can start this by running
the following command on the OS/400 command line: STRHOSTSVR
*DATABASE
You can verify if the OS/400 database host server is running by running the
NETSTAT *CNN command. When the Work with TCP/IP Connection Status
screen is displayed, look for entry as-database under the Local Port heading
and ensure it is in Listen status.
Atención: el arranque de todos los servicios puede tardar bastante y consumir mucha
máquina.
7
Conexión a un AS/400 (iSeries) desde JDBC
QHTTPSVR
QINTER
QSPL
QSYSWRK
QDSNX
QPGMR
QSERVER
QSNADS
QSYSSBSD
QUSRWRK
Como estas:
http://foros.emagister.com/mensaje-
PostPost_connection_refused_conectando_a_db2_desde_java-12625-638637-1-.htm
http://www.lawebdelprogramador.com/news/mostrar_new.php?
id=6&texto=AS/400&n1=491315&n2=0&n3=0&n4=0&n5=0&n6=0&n7=0&n8=0&n9=0&n0=0
Lo primero ha sido probar la conexión al AS400 desde un cliente que sabemos que
debería funcionar como un Access con driver ODBC. Hemos visto que esto también
fallaba.
Al final hemos tenido que levantar todos los servicios del AS400, esto casi fríe la
máquina pero al final ha conectado.
8
Conexión a un AS/400 (iSeries) desde JDBC
<hibernate-configuration>
<session-factory>
<property
name="hibernate.connection.driver_class">com.ibm.as400.access.AS400JDBCDri
ver</property>
<property
name="hibernate.connection.url">jdbc:as400://217.127.196.233/JAVADB2;promp
t=false</property>
<property name="hibernate.connection.username">JAVADB2</property>
<property name="hibernate.connection.password">DB2JAVA</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property
name="dialect">org.hibernate.dialect.DB2400Dialect</property>
<mapping resource="hello/Message.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Error SQL7008
9
Conexión a un AS/400 (iSeries) desde JDBC
Estoy teniendo este problema al hacer los insert intos esta es la sentencia que hibernate
intenta ejecutar:
insert into
MESSAGES
(MESSAGE_ID, MESSAGE_TEXT)
values
(default, ?)
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString( 1, text );
ps.executeUpdate();
ps.close();
}
Solución:
● http://www.mail-archive.com/forum.help400@combios.es/msg14793.html
● http://forum.hibernate.org/viewtopic.php?t=924511&highlight=sql7008
El problema es que tanto EJBs como Hibernate usan transacciones por defecto y para que
puedan funcionar el AS400 debe tener activados los diarios (journal) para el fichero que
se intenta actualizar.
10
Conexión a un AS/400 (iSeries) desde JDBC
Solución rápida:
Hackear el hibernate.cfg.xml:
<property name="hibernate.connection.isolation">0</property>
I too had to work against an AS400 database with journalling off. Setting
hibernate.connection.isolation 0 worked for me, however each statement was
autocommitted.
http://forum.hibernate.org/viewtopic.php?t=924511&highlight=sql7008
3. Preparar el AS400
11
Conexión a un AS/400 (iSeries) desde JDBC
1. ipServer
2. userName
3. userPassword
1. hibernate.connection.url
2. hibernate.connection.username
3. hibernate.connection.password
1. log4j.appender.R
2. log4j.appender.R.File
2. ant testJTOpen (para testear los select, insert ydelete en la tabla MESSAGES)
3. Preparar el AS400
12
Conexión a un AS/400 (iSeries) desde JDBC
1. hibernate.connection.url
2. hibernate.connection.username
3. hibernate.connection.password
1. log4j.appender.R
2. log4j.appender.R.File
1. ant dist
http://fernandoguillen.info:8180/java-db2/
13
Conexión a un AS/400 (iSeries) desde JDBC
Conclusiones
Ha sido una prueba dura y hemos tenido menos suerte de la que nos merecíamos.
Aún así esto puede ser una cosa a celebrar pues nos hemos topado y hemos superado
muchos obstáculos que sabremos solventar rápidamente en el futuro.
La conexión con el AS400 no es trivial y requiere de una configuración del AS400 muy
específica.
Existe más documentación sobre conectar JDBC con el AS400 de la que me esperaba.
IBM presta mucha documentación incluso un driver open-source para programar Java
atacando a un AS400.
14