Archivo de la etiqueta: PostgreSQL

Post técnico #2: PostgreSQL y lectura streams corruptos

Cuando se emplea PostgreSQL -puede ocurrir con otros Sistemas de Gestión de Bases de Datos (DBMS por sus suglas en inglés), no lo sé- en un entorno JEE 6 (lo cual se realiza a través de un driver JDBC suministrado por PostgreSQL aquí), JPA2 (EclipseLink), Glassfish 3.1, puede que durante la ejecución de nuestra aplicación, al intentar cargar información desde nuestra fuente de datos, se obtenga el siguiente problema:

… invalid stream header: BB656430…
Caused by: java.io.StreamCorruptedException: invalid stream header: BB656430
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:782)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
at org.quartz.impl.jdbcjobstore.PostgreSQLDelegate.getObjectFromBlob
(PostgreSQLDelegate.java:102)
at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectTrigger
(StdJDBCDelegate.java:2135)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveTrigger
(JobStoreSupport.java:1554)
… 58 more

Después de indagar y echarle la culpa a algún stream que pudiera quedar abierto mientras se leía la base de datos con anterioridad o a la serialización defectuosa del objeto que se pretende almacenar como BLOB en alguna tabla, es mejor echarle una mirada a la versión del driver JDBC con el cual se está realizando la conexión al DBMS; la versión de dicho driver debe ser superior a la del DBMS. Tuve este problema cuando intentaba conectarme a PostgreSQL 9.1 mediante el driver postgresql-8.3-603-jdbc3, cuando en realidad el driver que necesitaba era el postgresql-9.1-901-jdbc4. Para instalar dicho driver en la máquina virtual de Java se debe copiar el .jar del driver JDBC obtenido desde el sitio de descargas de PostgreSQL en el directorio $JVM_PATH/jre/lib/ext/, borrar el existente en tal directorio y reiniciar el equipo. En el url, $JVM_PATH hace referencia al directorio donde se ubica la Máquina Virtual de Java (JVM por sus siglas en inglés) que se está utilizando para compilar y ejecutar la aplicación. En mi caso (Sistema operativo: GNU/Linux Fedora 16, JVM: OpenJDK 1.6.0) el url completo era el siguiente:

/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/ext/

Para saber cuál era este directorio, desde mi IDE Netbeans (que es el que utilicé en ese momento para compilar y correr la aplicación), me dirigí al menú Tools->Java Platforms. Allí se lista la información necesaria sobre la plataforma utilizada por el IDE.

Plataformas de Java en Netbeans IDE

Así que no olviden actualizar sus drivers después de actualizar sus servidores.