Как лучше всего в JDBC вставить BLOB в Oracle? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть Java-код, который должен вставить байтовый массив в базу данных Oracle в столбец BLOB-объектов.Сигнатура функции:

void loadBlob(Connection connection, byte[] byteData, PreparedStatement ps) {...}

Массив байтов передается как параметр (нет необходимости читать его из какого-либо источника / потока).

PS был создан с использованием:

connection.prepareStatement("insert into mytable values(?)")

Mytable-скрипт: create table mytable (myblob blob)

Существует множество способов загрузки BLOB-объектов:

  1. Использование стандартного объекта BLOB-объекта jdbc
Blob blob = connection.createBlob();
blob.setBytes(1, byteData);
ps.setBlob(1, blob);
ps.execute();
blob.free();
Использование специфического объекта оракула
Blob blob = BLOB.createTemporary(connection, false, BLOB.DURATION_SESSION);
blob.setBytes(1, byteData);
ps.setBlob(1, blob);
ps.execute();
blob.free();
Использование функции базы данных oracle hextoraw
PreparedStatement ps2 = connection.prepareStatement("insert into mytable values (hextoraw(?))")
//convert the byte array to hexadecimal digits - the implementation is skipped to avoid de-focus from the main issue
String hexaDigits = convertByteArrayToHexaDigits(byteData);
ps2.setString(1, hexaDigits);
ps2.execute();

Вопрос

Каковы преимущества / недостатки вышеуказанных способов?Есть ли другие лучшие способы?

1 Ответ

1 голос
/ 05 марта 2019

Ваш первый и второй пример кажутся мне идентичными:

blob.setBytes(1, byteData);
ps.setBlob(1, blob);
ps.execute();
blob.free();

Я бы, вероятно, выбрал этот метод вместо вашего третьего примера. Причина этого заключается в том, что третий пример включает вызов функции Oracle hextoraw. Это, вероятно, повлечет за собой дополнительные накладные расходы во время вставки, и поэтому может не работать так же, как параметры 1 или 2.

...