Usando DataSource de Oracle

En uno de los proyectos en los que trabajo desarrollamos con ADF BC y ADF Faces. La herramienta es JDeveloper y, en tiempo de desarrollo, desplegamos en el OC4J embebido que proporciona la herramienta. Sin embargo, el servidor de pruebas y producción es un Tomcat 5.

Usamos clases Wrapper para invocar a procedimientos de base de datos. La conexión la tomamos de un JNDI que proporciona, en nuestro caso, Tomcat. El context.xml de nuestro servidor tenía esta configuración:


Hasta ahora todo había funcionado correctamente, hasta que necesitamos trabajar con un dato de tipo BLOB. Cuando intentábamos hacer esto:

oracle.sql.BLOB blob = 
    oracle.sql.BLOB.createTemporary(
                                    conexion,                                      // Conexión 
                                    true,                                            // Sí leer de caché 
                                    oracle.sql.BLOB.DURATION_SESSION  // Duración del blob 
                                    
                                               );

En el OC4J embebido funcionaba perfectamente pero en tomcat nos daba este fallo:

java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper 
at oracle.sql.BLOB.createTemporary(BLOB.java:532)

Mirando y probando mil cosas, la solución nos la dieron estos dos post de dos foros: Thread: ClassCastException in method CLOB.createTemporary y Tomcat 5 / Oracle / JDBC connection via JNDI not working. El problema es que estábamos utilizando conexiones “estándar” mientras intentábamos hacer cosas propietarias de Oracle como por ejemplo crear un blob. La solución es usar objetos de Oracle para establecer la comunicación con la base de datos.
Así que cambiamos este datasource:

import javax.sql.DataSource;

Por este otro:

import oracle.jdbc.pool.OracleDataSource;

Y cambiamos la configuración en tomcat por esta otra:


Hay que poner MUY especial cuidado en usar el atributo user en lugar de username o si no, nos dará un error de argumento no válido.

Anuncios