Postgresql, JDBC и БЛОБЫ потоковой передачи

Я пытаюсь получить блоб от базы данных пост-ГРЭС с помощью 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 я даже возьму альтернативные методы для потоковой передачи больших блобов как загрузка.

20
задан CJ F 15 January 2010 в 04:33
поделиться

2 ответа

Мое предположение, что вы перепутали кабины в стиле 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)
        ...
18
ответ дан 30 November 2019 в 00:59
поделиться

Будет ли PostgreSQL Docs для «хранения двоичных данных»?

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

Раздел под названием «Извлечение изображения из большого объекта», его внизу страницы может помочь.

6
ответ дан 30 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: