Я хочу сохранять большие вложения (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 в базе данных?
Есть ли у кого-нибудь совет, как это сделать?