Стало вдруг интересно как хибернейт справляется с отправкой в базу данных больших файлов.
Предположим есть таблица. В ней БЛОБ-поле. И в некую запись этой таблицы мне надо записать 10метровый файл.
Каковы мои действия ? Как описать POJO ? Как описать hbm.xml (или аннотации) ? Какие "особые" действия надо еще будет выполнить ?
неужели все юзают хибернейт лишь для тестов и что бы "посмотреть", а для реальных задач никто не юзает ? Или же все предпочитают хранить большие файлы на файловой системе, а не в БД ?
Здравствуйте, ke_passa, Вы писали:
_>Стало вдруг интересно как хибернейт справляется с отправкой в базу данных больших файлов.
я бы даже не стал рассматривать использование hibernate'а для этого
например, прямой jdbc с использованием потоков для переписывания содержимого блоба выглядит поперспективнее
Здравствуйте, C0s, Вы писали:
C0s>я бы даже не стал рассматривать использование hibernate'а для этого C0s>например, прямой jdbc с использованием потоков для переписывания содержимого блоба выглядит поперспективнее
Я подозреваю, что без особой необходимости большие файлы в базу редко кладут
Здравствуйте, ke_passa, Вы писали:
_>Я подозреваю, что без особой необходимости большие файлы в базу редко кладут
именно ... а уж какой необходимостью должно быть ещё и использование для этого hibernate мне даже сложно представить
в том-то и дело, что небольшие объекты легко отражать в блобы через промежуточные byte[] (либо сразу можно иметь byte[] если идёт речь об абстрактных файлах), но для больших это неприемлемо, т.к. недружественно по отношению к памяти
В случае файлов с размером 10 мегабайт, думаю, можно использовать хибернейтовский блоб (Hibernate.createBlob(byte[]) или Hibernate.createBlob(InputStream)). В бине дожны присутствовать также геттеры и сеттеры для блоба (или acess=field в маппинге) и геттер на InputStream возвращаемый блобом.
blob.getBinaryStream();
Соответственно в маппинге можно писать что-то типа <property name="file"><column name="FILE" sql-type="BLOB" /></property>
В MSSQL image хранятся в виде кучи мелких элементов по 8к каждая, поэтому при передаче весь блоб в память не загружается (если, конечно, вы не конвертнули файл в byte[], а использовали InputStream), про Oracle не знаю, но проверить вполне возможно
Вот пример такой необходимости: необходимость бекапа + возможность использования программой внешней базы данных.
То есть вы точно не знаете какая база данных будет использоваться (чистый jdbc никто не отменял, однако тогда нужно включать ещё обработку диалектов, кроме того остальное приложение использует hibernate)
Также есть требование бекапа. В случае с внешней базой данных бекап выглядит как бекап этой самой базы данных, приложение в нём не участвует. Однако файлы в этом случае теряются