JDBC 9.x y las variables de Timestamp de Java

Yo personalmente no programo en Java, lo hice hace casi 10 años y desde hace 8 no lo he vuelto a hacer asi que la verdad es que ni se exactamente como se declara una variable de fechas en Java.

Hace poco en un cliente donde tenian bastantes problemas de rendimiento en una de sus aplicaciones el cual es de una muy elevada criticidad (afecta a los que viajamos😉 ). La aplicacion esta hecha por J2EE sobre Oracle 9iR2 y como servidor de aplicaciones Bea Weblogic. Se veian queries muy simples contra tablas correctamente indexados realizando Full Table Scan, no era trivial porque lanzaba las mismas queries desde SQLPLUS y me iba de fabula asi que como casi siempre me acorde del bind peeking (los malditos!) pero despues de revisar unas 6 docenas de queries donde algunas no usaban bind variables y tenian el mismo problema de ir rapido en SQLPLUS y lento desde la aplicacion.

Despues de estar unos dias traceando y analizando las 200 trazas que genere me di cuenta que habia muchas ocurrencias de “Dump of memory” en las variables bind. Hablando con los desarrolladores los cuales me comentan que pasan las fechas de java como variables de timestamp a la base de datos. En las trazas muestar algo parecido a esto:

bind 5: dty=180 mxl=11(11) mal=00 scl=00 pre=00 oacflg=03 oacfl2=0 size=0 offset=120
bfp=40759cbc bln=11 avl=07 flg=01
value=
Dump of memory from 0x40759CBC to 0x40759CC3
40759CB0 0C0A6B78 [xk..]
40759CC0 00010101 [….]

Cuando value deberia de aparecer algo asi: value=”9/20/2007 9:20:0″ (dty=180 indica que la variable es del tipo Timestamp)

Cual es el problema? Es la version de JDBC, a partir de la version 9.x el JDBC deja de convertir las variables Timestamp de Java a Date, envia directamente a la base de datos tal cual porque Oracle 9i ya soporte este tipo de datos. La consecuencia es que el motor de la base de datos recibe la variable Timestamp y ve que el campo es un Date por lo tanto le aplica implicitamente un TO_DATE evitando el uso del indice.

La solucion es añadir v8compatible en las propiedades del JDBC. Y este problema ya he lo he visto en mas de un cliente.

One thought on “JDBC 9.x y las variables de Timestamp de Java

  1. Pingback: Oracle JDBC date manipulation « Programming and So

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s