Я пытаюсь получить блоб от базы данных пост-ГРЭС с помощью jdbc драйверов. Это является слишком большим, чтобы иметь в памяти, таким образом, я хочу передать его потоком как загрузку. Я пытался использовать getBinaryStream метод на ResultSet, но оказывается, что этот метод на самом деле читает все это в память, не работает на большой файл.
По-видимому, можно использовать getBlob метод на наборе результатов, и presumeably получают inputstream от блоба и идут оттуда, но это - то, где я сталкиваюсь со своей проблемой.
PreparedStatement ps = con.prepareStatement("select data from file_data WHERE ID = ?");
ps.setLong(1,file.fileData.id)
ResultSet rs = ps.executeQuery()
if(rs.next()){
rs.getBlob("data")
Это - код, который я выполняю. Когда это добирается до той последней строки, это выводит ошибку, которую я не могу понять...
org.postgresql.util. PSQLException: Плохое значение для типа долго: xxxxxx
"xxxxxx" тогда является содержанием файла. Можно предположить, что это становится довольно длинным, но не действительно точка.
Я застреваю здесь. У кого-либо есть какие-либо идеи о том, что продолжается? Heck я даже возьму альтернативные методы для потоковой передачи больших блобов как загрузка.
Мое предположение, что вы перепутали кабины в стиле OID и Bytea. Большие двоичные объекты хранятся косвенные с колоннами OID в Postgres. Фактические файловые данные хранятся где-то за пределами таблицы базы данных postgres. Столбец просто содержит идентификатор объекта, который связан внутри с BLOB. Например:
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)
Если вы используете метод GetBlob (String)
[11114869]
[String) [11114869]. getblob
Читает данные из колонны и преобразует его на длину
. Затем он пытается прочитать связанные двоичные данные из его внутреннего хранилища.
С другой стороны, с Bytea вы можете разместить небольшие кусочки двоичных данных непосредственно в вашу БД. Например:
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 | \336\255\276\357\336\255\276\357
(1 row)
Здесь столбец данных напрямую содержит двоичные данные. Если вы попытаетесь использовать getBlob
на таком столбце на таком столбце, данные все равно будут интерпретировать как OID, но, очевидно, он не будет вписываться в длинный
. Давайте попробуем это в базе данных, мы только что создали:
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");
===> org.postgresql.jdbc4.Jdbc4Connection@3a0b2c64
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()
===> org.postgresql.jdbc4.Jdbc4ResultSet@66f9104a
groovy:000> rs.next()
===> true
groovy:000> rs.getBlob("image")
ERROR org.postgresql.util.PSQLException: Bad value for type long : \336\255\276\357\336\255\276\357
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)
...
Будет ли PostgreSQL Docs для «хранения двоичных данных»?
http://jdbc.postgresql.org/documentation/head/bized-data.html
Раздел под названием «Извлечение изображения из большого объекта», его внизу страницы может помочь.