DB2 y Java: No los llamaría amigos…

En mi día a día de trabajo, es habitual tener que enfrentarse con DB2 como base de datos. Es más habitual aun hacerlo con utilidades y funciones de Java, porque es en esta tecnología que trabajo. En adelante una de las varias aventuras que un desarrollador tiene que enfrentarse para poder hacer sus tareas cuando se trabaja con DB2+Java.

Introducción

DB2 es un motor de base de datos construido por IBM. En los últimos tiempos con mucha inversión se ha logrado posicionar dentro de las más grandes compañías del mundo. Principalmente porque aquellas empresas que tienen Mainframe/Cobol prefieren seguir contando con su proveedor de tecnología. Así es como IBM es la mejor opción.

Por otro lado, dentro de este mismo marco tecnológico, al usar IBM para base de datos, también se prefiere usar IBM para entornos de desarrollo de nueva generación. Es así como decide usarse WebSphere en estas ocasiones. El WebSphere es otra “grandiosa” herramienta de IBM de la que vamos a hablar en otra ocasión.

Problema

Cuando de Java se trata, es muy habitual necesitar una librería JDBC para acceder a una base de datos. Hay diferentes tipos de niveles JDBC y cada nivel tendrá su correspondiente driver y clase de implementación para la Conexión (java.sql.Connection). Los factores que yo considero graves a la hora de usar DB2 como base de datos desde Java son:

  • En versiones antiguas de DB2 driver, era necesario instalar un listener (pequeño demonio en el servidor) que escuara los pedidos de JDBC, porque trabaja en un nivel no nativo. Este listener transformaría los pedidos remotos en bajo nivel, cuestión que DB2 lo interprete (o sea, el driver en el cliente es muy bobo y solo reenvia los pedidos e interpreta las respuestas)
  • Las versiones antes mencionadas muestran errores coherentes y claros cuando hay problemas, sin embargo la descripción de los errores, en drivers nuevos,  son con códigos, pero códigos feos, que uno tiene que interpretar mágicamente. Ejemplo: SQLCODE: -401, SQLSTATE: 42818 para decirnos que los operadores no son compatibles.
  • La actualización de los drivers. Mi peor problema. ¡No exsiten! es prácticamente imposible encontar un driver lisa y llanamente. Es necesario recorrer toda internet y bajarse un paquete integramente de drivers para DB2, descomprimirlo manualmente y, para colmo de males, descomprimir un .CAB para así sacarles los drivers necesarios para conexión.
  • En lo que Java respecta, hay instalaciones de DB2 en dónde no funcionan bien algunos métodos de obtención de Metadata (DatabaseMetadata), para lo cuál también hablaremos en algún momento ;).

Solución

Probablemente si llegaron aquí es porque quieren algunas respuestas. Respuestas a nivel informativo, respuestas porque han tenido problemas similares a los mios o sencillamente porque ya agotaron todos los recursos que tuvieron disponibles. Lamentablemente cuando se trata de DB2 cada instalación es un mundo y decirles que tengo la solución es dificil… pero voy a hacerles algunas sugerencias que pueden ser útiles.

  • Para bajar los drivers, hacerlo de este link (upd: nuevo link). Si les pide usuario, dense de alta, es gratis y no te llenan la casilla de Spam. Aviso, es un archivo de casi 300mb (gracias IBM por sobrecargar la red)
  • Al bajar ese archivo, descomprimirlo en algún lado y buscar el archivo db2_v9_nt32_client.zip\CLIENT\image\db2\Windows\JDBC0001.cab (esto es en la versión que yo bajé). Ese archivo contiene algunos archivos .AAAAAA2677C3 borrar esta extensión, deberían quedar archivos .JAR y .ZIP. Estos son los drivers JDBC para DB2.
  • Los errores son bastante habituales, pero no desesperen. Hay una genial página de IBM que supuestamente tiene detalle de todos los errores con una cierta descripción. DB2 Universal Database – SQL Messages.
  • Cuando se intenta obtener información de MetaData, a veces es bueno no especificar el tipo de dato que estamos buscando (por ejemplo, si queremos ver la estructura de una tabla y nuestro acceso es a través de su sinónimo, mejor no indicar tabla, dejar que el driver traiga lo que crea conveniente)

Referencias

http://www.ibm.com/developerworks/db2/library/techarticle/dm-0512kokkat/#install

http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.java.doc/doc/tjvjcccn.htm

http://uda.openlinksw.com/jdbc/mt/jdbc-db2-mt/

https://www14.software.ibm.com/webapp/iwm/web/preLogin.do?lang=en_US&source=swg-idsjs11

Conclusión

Espero haberles sido de ayuda… debo confesar que diariamente lucho contra esto. Creo que IBM hace un buen trabajo de bajo nivel, pero cuando tiene que poner un poco sobre el programador o usuario, se queda medio corto.

Los drivers de DB2 deberían estar super pulidos, hasta Oracle tiene unos drivers Excelentes.. pero más allá de eso prácticamente todas las comunidades opensource tienen drivers geniales. Hasta SQL Server da unos drivers excelentes. ¡A ver si aprendemos ibm!


6 Responses to “DB2 y Java: No los llamaría amigos…”

  1. gracias me ayudo mucho 😉

  2. Hola, estoy trabajando con websphere y db2. Y estoy desesperado porque los drivers por defecto no funcionan como deberían.

    Buceando en la web me he encontrado con este blog y quisiera probar la solución que esplicas en este post.

    La única pega es que el enlace de los drivers parece que no va. No sabrías decirme por dónde puedo bajármelos?

    Gracias de antemano, y estupendo blog.

  3. Lamentablemente, los links de IBM cambian todo el tiempo (actualicé el link).

    Pero si vas a la página de ibm, en la parte de support drivers y buscás con estas características:
    Product category: Information Management
    Product sub-category: DB2 for Linux, UNIX and Windows
    Operating system: Windows
    Software version: 9.5

    Decime si te sirve, si no, buscamos otra forma… El problema es que IBM no permite distribuir sus drivers, entonces, no puedo ponerlo acá…

  4. Ya me va. Gracias, ahora me falta hacerlo funcionar! Gracias por todo, me has hecho un gran favor! Y para la siguiente ya se cómo buscar 😉

  5. Hola, estoy tratando de conseguir el driver que indicas líneas arriba, pero en todos los links de esa página no menciona el archivo db2_v9_nt32_client.zip, también hice la búsqueda en la página de IBM con los parámetros indicados pero no resulta.
    Te agradeceré me ayudes con este tema. El AS400 tiene versión V5R4 y la conexión la quisiera hacer desde netbeans 6.8

  6. @Willy tenés que bajarte el “client tools” de IBM, y dentro de esos archivos estará este otro. Lamentablemente IBM no permite que distribuyamos contenidos de ellos, por eso es aunque molesto, necesario.

Discussion Area - Leave a Comment