Saltar al contenido

Postgresql, JDBC y transmisión de BLOB

Nuestros mejores programadores agotaron sus reservas de café, investigando a tiempo completo por la resolución, hasta que Estrella encontró la respuesta en Gogs y hoy la comparte con nosotros.

Solución:

Supongo que tienes mixed blobs de estilo OID y BYTEA. Los objetos binarios grandes se almacenan indirectamente con columnas OID en Postgres. Postgres almacena los datos reales del archivo en algún lugar fuera de la tabla de la base de datos. La columna solo contiene un identificador de objeto que está asociado internamente con el blob. Por ejemplo:

janko=# CREATE TABLE blobtest1 (name CHAR(30), image OID);
CREATE TABLE                                              
janko=# INSERT INTO blobtest1 VALUES ('stackoverflow', lo_import('/tmp/stackoverflow-logo.png'));
INSERT 0 1
janko=# SELECT * FROM blobtest1;
              name              | image
--------------------------------+-------
 stackoverflow                  | 16389
(1 row)

Si usas el ResultSet#getBlob(String) método, de lo que se espera una columna de estilo OID. getBlob lee los datos de la columna y los convierte en un Long. Luego intenta leer los datos binarios asociados de su almacenamiento interno.

Por otro lado, con BYTEA puede colocar pequeñas piezas de datos binarios directamente en su base de datos. Por ejemplo:

janko=# CREATE TABLE blobtest2 (name CHAR(30), image BYTEA);
CREATE TABLE
janko=# INSERT INTO blobtest2 VALUES ('somebinary', E'\336\255\276\357\336\255\276\357');
INSERT 0 1
janko=# SELECT * FROM blobtest2;
              name              |              image
--------------------------------+----------------------------------
 somebinary                     | 336255276357336255276357
(1 row)

Aquí, la columna de datos contiene directamente los datos binarios. Si intentas usar getBlob en dicha columna, los datos aún se interpretarán como un OID pero obviamente no encajarán en un Long. Probemos esto en la base de datos que acabamos de crear:

groovy:000> import java.sql.*
===> [import java.sql.*]
groovy:000> Class.forName("org.postgresql.Driver");
===> class org.postgresql.Driver
groovy:000> db = DriverManager.getConnection("jdbc:postgresql:janko", "janko", "qwertz");
===> [email protected]
groovy:000> ps = db.prepareStatement("SELECT image FROM blobtest2 WHERE name = ?");
===> SELECT image FROM blobtest2 WHERE name = ?
groovy:000> ps.setString(1, "somebinary")
===> null
groovy:000> rs = ps.executeQuery()
===> [email protected]
groovy:000> rs.next()
===> true
groovy:000> rs.getBlob("image")
ERROR org.postgresql.util.PSQLException: Bad value for type long : 336255276357336255276357
        at org.postgresql.jdbc2.AbstractJdbc2ResultSet.toLong (AbstractJdbc2ResultSet.java:2796)
        at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getLong (AbstractJdbc2ResultSet.java:2019)
        at org.postgresql.jdbc4.Jdbc4ResultSet.getBlob (Jdbc4ResultSet.java:52)
        at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getBlob (AbstractJdbc2ResultSet.java:335)
        at groovysh_evaluate.run (groovysh_evaluate:3)
        ...

¿Ayudarían los documentos de PostgreSQL para “Almacenar datos binarios”?

http://jdbc.postgresql.org/documentation/head/binary-data.html

La sección titulada “Recuperación de la imagen del objeto grande”, que se encuentra en la parte inferior de la página, podría ayudar.

Acuérdate de que tienes la capacidad de decir .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *