miércoles, 14 de enero de 2009

Mis problemas con un CLOB en JDBC y Ajax

Mi problema de esta semana ha sido con los CLOBs, no concretamente con la clase java.sql.Clob sino añadiendo el soporte de Clob a mi framework.

El primer problema
El primer problema lo he tenido con la base de datos.Para actualizar una columna con un CLOB he usado el método del interfaz java.sql.PreparedStatement:

setCharacterStream(int parameterIndex,Reader reader)

Pero al usarlo desde Tomcat 6 da el siguiente error:

java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setCharacterStream (ILjava/io/Reader;)V

Al mirar un poco me doy cuenta que el método que estoy usando se ha añadido a Java 6. Eso no debería ser mayor problema ya que el driver que uso soporta JDBC 4.0 y además en una aplicación de escritorio si que funciona el código.

Por lo que he visto del error parece que Tomcat además de encapsular el interfaz Connection para el tema del pool de conexiones, también tiene su propia implementación del interfaz java.sql.PreparedStatement y parece que no tiene el método de Java 6 implementado aunque el driver JDBC si que lo soporte.

¿Solución?
Usar el método que estaba desde Java 1.2 al que hay que pasarle un parámetro más que es un entero con los caracteres a leer:

setCharacterStream(int parameterIndex,Reader reader,int length)

Y ahora ya funciona sin problemas.

El segundo problema
El segundo problema que he tenido ha sido con AJAX, concretamente al enviar el XML con el CLOB desde el servidor al cliente.En principio no pensaba que habría ningún problema , simplemente era enviar un String más largo dentro del XML (el CLOB) y ponerlo en un TextArea.

Pués bien, tras probarlo me doy cuanta que en alguna parte se trunca el texto. Con firebug veo el XML que mando desde el servidor y veo que está todo.Pero al llegar al TextArea faltan datos. Después de depurar un poco y ver el tamaño del texto en el TextArea veo que solo tiene 4096 caracteres.
!!Sorpresa!!!
Esto suena a limitación del firefox en el tamaño máximo del contenido de un tag XML.

<prueba>Aqui NO que se pueden poner más de 4096 bytes porque sino FF los corta</prueba>

¿Solución?
Por suerte si pones el texto usando CDATA si que funciona. Uf!!!!!.

<prueba><!--[CDATA[Aqui si que se pueden poner más de 4096 bytes.]]</prueba>


He llegado a hacer pruebas con 50.000 caracteres y no he tenido problemas.