|
|
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
Добрый день. Имею: JBoss 6.1 и MSSQL 2008R2 Нужно организовать хранилище файлов (каждый в несколько метров), какой подход выбрать? Из моих изысканий определились варианты: MyBatis, jdbc или ORM. Какие существуют best practices в этой области? Предложите свои идеи Хотелось бы получить наиболее быстрый способ надежный способ, который не блокирует целиком таблицу, когда идет запись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2013, 16:14:55 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
Эксперимент: Вставка 1 файла (~100MB) по 10 раз, каждый в отдельном потоке, с помощью трех технологий: Hibernate, MyBatis, JDBC Результат: 1) JDBC работает с терпимой скоростью, но при этом эксклюзивно блокирует таблицу во время вставки блоба через потоковое (stream) API. Ни записать, ни прочитать в этот момент ничего нельзя (другие потоки (threads) приложения ждут). Пока файл не залит до конца — таблица заблокирована. Если скорость канала маленькая, то ждать придётся долго. А если в этом время отпал линк, то вообще придётся ловить таймаут базы, это несколько минут. 2) Встроенный механизм JPA (в JBoss работает поверх Hibernate) через @Lob — с параллельностью ситуация лучше, но есть проблемы с памятью (Много тратит, плохо освобождает). Насколько много — до 4 копий бинарного контента файла в памяти + длинная шестнадцатиричная строка (в два раза длиннее), в которую кодируется блоб (на это дополнительно тратится процессорное время, поэтому работает в целом медленнее). То есть, на один 25-меговый файл тратится до 150 мегабайтов оперативки одномоментно. Причём, GC собирает её не сразу — рантайм JPA нужно попросить освободить объекты. Также внимательно следить за стратегиями загрузки при получении объекта из базы, потому что Hibernate имеет обыкновение подгружать лишнего. 3) MyBatis — сторонняя библиотека, не похожая по подходу на EE. Работает медленнее, чем Hibernate, конфигурируется отдельно через XML, работает с POJO-сущностями, поэтому смешивать с остальным подходом к DAO, построенном на аннотациях и generic’ах, я считаю плохой практикой. Память тратится тоже ощутимо. (Если брать другую стороннюю библиотеку, например, Spring Framework — будут те же самые грабли в другой профиль) Прикладываю отчет по горячим точкам PS: Если кому интересно, могу выложить проект на GitHub ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 13:50:27 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
Еще в хибернейте можно замапить блобы через binary. В программе это будут просто byte[] поля. Возможно, будет быстрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 14:00:59 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
я бы хранил в базе только пути к файлу(id, имя и тд.. на выбор), а сами файлы в файловой системе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 14:02:50 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
ivanra, Можно подробнее? breath, В файловой системе можно держать данные, если безопасники разрешат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 14:10:12 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
ivanraЕще в хибернейте можно замапить блобы через binary. В программе это будут просто byte[] поля. Возможно, будет быстрее Насчет JPA аннотаций не пробовал, а с hibernate-меппингом это выглядит так: Поле в entity-классе: Код: java 1. в меппинг-файле Classname.hbm.xml: Код: xml 1. 2. 3. Я подробно не разбирался, поскольку блобы были не очень большие, но, по-моему, реализация получается не ленивая, то есть в селектах надо внимательно смотреть и брать блоб-поля только когда они действительно нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 14:23:28 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
ivanraЯ подробно не разбирался, поскольку блобы были не очень большие, но, по-моему, реализация получается не ленивая, то есть в селектах надо внимательно смотреть и брать блоб-поля только когда они действительно нужны. Для ленивых свойств нужно бины инструментировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 14:40:21 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
ivanra, Я работаю с аннотированными бинами: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Поэтому, скорее всего, работа через аннотации и *.hbm.xml будет одинакова ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 15:05:57 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
kastolomivanra, Я работаю с аннотированными бинами: Код: java 1. 2. Поэтому, скорее всего, работа через аннотации и *.hbm.xml будет одинакова Думаю, что тут все-таки имеется прокладка EntityManager, которую можно убрать и работать напрямую через хибернейт. Не уверен, но возможно сэкономит память в 2 раза. Примерно так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 15:51:04 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
ivanra, Работа с базой меня именно через SessionFactory ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 16:04:57 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
kastolomЭксперимент: Вставка 1 файла (~100MB) по 10 раз, каждый в отдельном потоке, с помощью трех технологий: Hibernate, MyBatis, JDBC Результат: 1) JDBC работает с терпимой скоростью, но при этом эксклюзивно блокирует таблицу во время вставки блоба через потоковое (stream) API. Ни записать, ни прочитать в этот момент ничего нельзя (другие потоки (threads) приложения ждут). Пока файл не залит до конца — таблица заблокирована. Если скорость канала маленькая, то ждать придётся долго. А если в этом время отпал линк, то вообще придётся ловить таймаут базы, это несколько минут. 2) Встроенный механизм JPA (в JBoss работает поверх Hibernate) через @Lob — с параллельностью ситуация лучше, но есть проблемы с памятью (Много тратит, плохо освобождает). Насколько много — до 4 копий бинарного контента файла в памяти + длинная шестнадцатиричная строка (в два раза длиннее), в которую кодируется блоб (на это дополнительно тратится процессорное время, поэтому работает в целом медленнее). То есть, на один 25-меговый файл тратится до 150 мегабайтов оперативки одномоментно. Причём, GC собирает её не сразу — рантайм JPA нужно попросить освободить объекты. Также внимательно следить за стратегиями загрузки при получении объекта из базы, потому что Hibernate имеет обыкновение подгружать лишнего. 3) MyBatis — сторонняя библиотека, не похожая по подходу на EE. Работает медленнее, чем Hibernate, конфигурируется отдельно через XML, работает с POJO-сущностями, поэтому смешивать с остальным подходом к DAO, построенном на аннотациях и generic’ах, я считаю плохой практикой. Память тратится тоже ощутимо. (Если брать другую стороннюю библиотеку, например, Spring Framework — будут те же самые грабли в другой профиль) Прикладываю отчет по горячим точкам PS: Если кому интересно, могу выложить проект на GitHub Есть вопрос - а как же вставляет blob Hibernate, он же работает через JDBC. Hibernate что, не использует потоковое API, или открывает разу n-потоков для записи (раз так можно)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 16:50:55 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
SergeyAKMЕсть вопрос - а как же вставляет blob Hibernate, он же работает через JDBC. Hibernate что, не использует потоковое API, или открывает разу n-потоков для записи (раз так можно)? Зависит от того какого типа свойство и от настроек хибера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 17:06:12 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
ivanraДумаю, что тут все-таки имеется прокладка EntityManager, которую можно убрать и работать напрямую через хибернейт. Не уверен, но возможно сэкономит память в 2 раза. Почему всего в 2, а не в 10? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 17:06:55 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
Через хэндлер можно и в Hibernate работать через IO вместо загрузки всех мегабайт в RAM. http://turgaykivrak.wordpress.com/2008/06/06/blob-objects-with-spring-and-hibernate/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 17:09:01 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
kastolom, авторэксклюзивно блокирует а вставлять в специальную таблицу + переместить запросом? к тому же сомневаюсь, что hibernate работает как-то не через jdbc, может можно настроить так чтобы не было блокировки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 17:22:31 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
Лагманkastolom, авторэксклюзивно блокирует а вставлять в специальную таблицу + переместить запросом? к тому же сомневаюсь, что hibernate работает как-то не через jdbc, может можно настроить так чтобы не было блокировки? Хибер для некоторых задач пользуется временными таблицами. Не факт что при использовании хибера не было лока. Просто автор загружал все данные в память, а при работе через JDBC - прокачивал из файловой системы, возможно, не достаточно эффективно. БОльшая задержка - явный лок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 17:34:49 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
BlazkowiczSergeyAKMЕсть вопрос - а как же вставляет blob Hibernate, он же работает через JDBC. Hibernate что, не использует потоковое API, или открывает разу n-потоков для записи (раз так можно)? Зависит от того какого типа свойство и от настроек хибера. А можно уточнить, а правильно понимаю что максимум что он, hibernate, может использовать это вызвать напрямую JDBC драйвер в обход JDBC интерфейса, т.е. например не PreparedStatement, а OraclePreparedStatement? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 18:47:13 |
|
||
|
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
|
|||
|---|---|---|---|
|
#18+
SergeyAKMА можно уточнить, а правильно понимаю что максимум что он, hibernate, может использовать это вызвать напрямую JDBC драйвер в обход JDBC интерфейса, т.е. например не PreparedStatement, а OraclePreparedStatement? Да, типа того. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 18:49:07 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38235372&tid=2129497]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
63ms |
get topic data: |
21ms |
get forum data: |
6ms |
get page messages: |
90ms |
get tp. blocked users: |
2ms |
| others: | 291ms |
| total: | 512ms |

| 0 / 0 |
