Я работаю над веб-проектом, основанным на 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 будут высоко цениться.
Спасибо