Сохранение большого двоичного объекта с помощью потока из EJB в базу данных (эффективным способом с точки зрения использования памяти)

Я хочу сохранять большие вложения (500 Мб, может быть, если возможно, даже > 2 Гб) в базе данных. Я знаю, что плюсы и минусы этого очень часто обсуждаются, но мой вопрос не в этом.

Обычный способ хранения полей Blob в EJB3 с JPA заключается в использовании следующего кода:

@Lob
private byte[] data;

Это становится проблемой при работе с огромными источниками данных, поскольку весь массив байтов сохраняется в памяти.

Я попытался изменить его на Blob:

@Lob
private Blob data;

Но это приводит к той же проблеме. При вызове

// session: Hibernate session.
// Actually, I'd like to stay with JPA's abstraction and not
// reference Hibernate directly, if possible
Blob data = session.createBlob(inputStream, lengthOfStream);

метод createBlob создает byteArray из inputStream.

Из-за отображения ORM мне также интересно, как обрабатывать вставку данных. Одна из идей состояла в том, чтобы создать переменную сущности

@Lob
private byte[] data;

, которую я никогда не буду использовать. Таким образом, схема базы данных будет построена. Но поскольку аннотация @Lob ленивая, она не будет раздувать мою память.

А затем напишите

entityManager.persist(dataObject);
// The following lines are _completely_ imaginatory!!
query.prepare("update DataObject d set d.data = :dataInputStream where d = :dataObject");
query.setProperty("dataObject", dataObject);
query.setProperty("dataInputStream", someDataInputStream);

Одно решение, на которое я наткнулся, выглядит красиво, но не использует JPA: Самый лучший способ сохранить BLOB в базе данных?

Есть ли у кого-нибудь совет, как это сделать?

7
задан Community 23 May 2017 в 12:24
поделиться