2011-01-28 18 views
7

Estoy ejecutando Mac OSX 10.6 con PostgreSQL 9.0. Escribí una aplicación Java simple que inserta una imagen en un campo bytea y luego consulta el mismo campo para verificarlo.¿Qué ha cambiado entre postgres jdbc 8.4 y 9 con respecto a bytearrays?

La tabla:

CREATE TABLE test.test_table 
    (
    id integer NOT NULL, 
    image bytea, 
    CONSTRAINT test_table_pkey PRIMARY KEY (id) 
); 

El programa es algo así como:

//insert the file 
    PreparedStatement ps = connection.prepareStatement("INSERT INTO test.test_table(id, image) VALUES (?, ?);"); 
      byte[] bytesFromFile = readFile("img/test1.bmp"); 
      ps.setInt(1, 1); 
      ps.setBytes(2, bytesFromFile); 
      ps.execute(); 
      ps.close(); 

      PreparedStatement stmt = connection.prepareStatement("Select id,image from test.test_table"); 
      ResultSet rs = stmt.executeQuery(); 
    //Get the file from the BD and save it to the FS 
      while (rs.next()) { 
       String id = rs.getString(1); 
       InputStream imageStream = rs.getBinaryStream(2); 
       String imageName = OUTPUT_DIR + "/" + id + ".bmp"; 
       FileOutputStream f = new FileOutputStream(imageName); 
       byte buff[] = new byte[1024]; 
       int l; 
       while ((l = imageStream.read(buff)) > 0) { 
        f.write(buff, 0, l); 
       } 
       f.close(); 
       System.out.println("CREATED : " + imageName);// + " size " + 

      } 

aquí están los hechos.

  1. Uso del controlador de PostgreSQL-9.0-801.jdbc4.jar que funciona perfectamente tanto en PostgreSQL 8.4 y con PostgreSQL 9

  2. Uso del controlador de 8.4-701.jdbc4 funciona sólo en PostgreSQL 8.4.

  3. El uso del controlador 8.4-701.jdbc4 con PostgreSQL 9 no funciona. El archivo extraído es diferente. Un md5 muestra que el contenido en la base de datos es igual al archivo original. Por lo tanto, mi suposición es que el problema es durante la extracción del archivo.

Puedo actualizar el controlador, no hay problema. Mi preocupación es: ¿qué ha cambiado dentro del protocolo de comunicación que ya no es compatible con PostgreSQL 9?

Respuesta

10

La codificación de matrices de bytes (la forma en que el servidor los envía) se ha cambiado desde 8,4 hasta 9,0:

Ver las notas de la versión:
http://www.postgresql.org/docs/9.0/static/release-9-0.html#AEN99255

y la descripción de la configuración de ajuste para los detalles :
http://www.postgresql.org/docs/9.0/static/runtime-config-client.html#GUC-BYTEA-OUTPUT

+0

+1 tsk por respuesta! En resumen, el controlador 8.4 está esperando datos en modo de escape, pero PostgreSQL 9 lo está enviando en modo hexadecimal. –

Cuestiones relacionadas