Я работаю над веб-проектом на основе Spring + Hibernate + MySQL. Я застрял в точке, где мне нужно хранить изображения, загруженные пользователем в базу данных. Хотя я написал код, который на данный момент работает хорошо, но я считаю, что когда проект будет запущен, все будет плохо.
Вот мой предметный класс, который несет байты изображения:
@Entity
public class Picture implements java.io.Serializable{
long id;
byte[] data;
... // getters and setters
}
А вот мой контроллер, который сохраняет файл при отправке:
public class PictureUploadFormController extends AbstractBaseFormController{
...
protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception{
MutlipartFile file;
// getting MultipartFile from the command object
...
// beginning hibernate transaction
...
Picture p=new Picture();
p.setData(file.getBytes());
pictureDAO.makePersistent(p); // this method simply calls getSession().saveOrUpdate(p)
// committing hiernate transaction
...
}
...
}
Очевидно, плохой код. Могу ли я использовать InputStream или Blob для сохранения данных вместо того, чтобы сначала загружать все байты от пользователя в память, а затем помещать их в базу данных?
Я провел некоторое исследование поддержки Hibernate для Blob и нашел это в книге Hibernate In Action:
java.sql.Blob и java.sql.Clob - наиболее эффективный способ обработки больших объектов в Java. К сожалению, экземпляр Blob или Clob можно использовать только до завершения транзакции JDBC. Итак, если ваш постоянный класс определяет свойство java.sql.Clob или java.sql.Blob (в любом случае, это не очень хорошая идея), вы будете ограничены в том, как можно использовать экземпляры класса. В частности, вы не сможете использовать экземпляры этого класса как отдельные объекты. Кроме того, многие драйверы JDBC не имеют рабочей поддержки для java.sql.Blob и java.sql.Clob. Следовательно, имеет смысл отображать большие объекты с использованием двоичного или текстового типа сопоставления, предполагая, что извлечение всего большого объекта в память не снижает производительность.
Обратите внимание, что на веб-сайте Hibernate вы можете найти современные шаблоны проектирования и советы по использованию больших объектов, а также рекомендации для конкретных платформ.
Теперь очевидно нельзя использовать Blob, так как это в любом случае не очень хорошая идея, что еще можно использовать для повышения производительности? Мне не удалось найти ни обновленных шаблонов дизайна, ни какой-либо полезной информации на веб-сайте Hibernate. Поэтому мы будем очень благодарны за любую помощь / рекомендации от stackoverflowers.
Спасибо