Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов / 18 сообщений из 18, страница 1 из 1
15.04.2013, 16:14:55
    #38226152
kastolom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
Добрый день.
Имею: JBoss 6.1 и MSSQL 2008R2
Нужно организовать хранилище файлов (каждый в несколько метров), какой подход выбрать?
Из моих изысканий определились варианты: MyBatis, jdbc или ORM.
Какие существуют best practices в этой области? Предложите свои идеи
Хотелось бы получить наиболее быстрый способ надежный способ, который не блокирует целиком таблицу, когда идет запись
...
Рейтинг: 0 / 0
22.04.2013, 13:50:27
    #38234972
kastolom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
Эксперимент: Вставка 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
...
Рейтинг: 0 / 0
22.04.2013, 14:00:59
    #38235010
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
Еще в хибернейте можно замапить блобы через binary. В программе это будут просто byte[] поля. Возможно, будет быстрее
...
Рейтинг: 0 / 0
22.04.2013, 14:02:50
    #38235014
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
я бы хранил в базе только пути к файлу(id, имя и тд.. на выбор), а сами файлы в файловой системе
...
Рейтинг: 0 / 0
22.04.2013, 14:10:12
    #38235031
kastolom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
ivanra,

Можно подробнее?

breath,

В файловой системе можно держать данные, если безопасники разрешат
...
Рейтинг: 0 / 0
22.04.2013, 14:23:28
    #38235059
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
ivanraЕще в хибернейте можно замапить блобы через binary. В программе это будут просто byte[] поля. Возможно, будет быстрее
Насчет JPA аннотаций не пробовал, а с hibernate-меппингом это выглядит так:
Поле в entity-классе:
Код: java
1.
	private byte[] template;


в меппинг-файле Classname.hbm.xml:
Код: xml
1.
2.
3.
        <property name="template" type="binary">
            <column name="TEMPLATE" />
        </property>


Я подробно не разбирался, поскольку блобы были не очень большие, но, по-моему, реализация получается не ленивая, то есть в селектах надо внимательно смотреть и брать блоб-поля только когда они действительно нужны.
...
Рейтинг: 0 / 0
22.04.2013, 14:40:21
    #38235093
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
ivanraЯ подробно не разбирался, поскольку блобы были не очень большие, но, по-моему, реализация получается не ленивая, то есть в селектах надо внимательно смотреть и брать блоб-поля только когда они действительно нужны.
Для ленивых свойств нужно бины инструментировать.
...
Рейтинг: 0 / 0
22.04.2013, 15:05:57
    #38235138
kastolom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
ivanra,

Я работаю с аннотированными бинами:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
@Entity
@Table(name="hibernate_files")
public class FileEntity implements Serializable {

    private static final long serialVersionUID = -4349156718803569954L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Lob
    @Basic(fetch= FetchType.LAZY)
    private byte[] content;
    ...
}


Поэтому, скорее всего, работа через аннотации и *.hbm.xml будет одинакова
...
Рейтинг: 0 / 0
22.04.2013, 15:51:04
    #38235215
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
kastolomivanra,
Я работаю с аннотированными бинами:
Код: java
1.
2.
@Entity
...


Поэтому, скорее всего, работа через аннотации и *.hbm.xml будет одинакова
Думаю, что тут все-таки имеется прокладка EntityManager, которую можно убрать и работать напрямую через хибернейт. Не уверен, но возможно сэкономит память в 2 раза. Примерно так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	@PersistenceContext
	private EntityManager em;

	public void SomeMethod() {
		// получаем прямой доступ к org.hibernate.Session
		Session session = (Session) em.getDelegate();
		// что-то поделали с объектами базы, через hibernate-методы
...
		session.saveOrUpdate(entityObject);
		session.flush(); // EntityManager изменений не видит, поэтому вручную
	}
...
Рейтинг: 0 / 0
22.04.2013, 16:04:57
    #38235247
kastolom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
ivanra,

Работа с базой меня именно через SessionFactory
...
Рейтинг: 0 / 0
22.04.2013, 16:50:55
    #38235372
SergeyAKM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
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-потоков для записи (раз так можно)?
...
Рейтинг: 0 / 0
22.04.2013, 17:06:12
    #38235397
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
SergeyAKMЕсть вопрос - а как же вставляет blob Hibernate, он же работает через JDBC. Hibernate что, не использует потоковое API, или открывает разу n-потоков для записи (раз так можно)?
Зависит от того какого типа свойство и от настроек хибера.
...
Рейтинг: 0 / 0
22.04.2013, 17:06:55
    #38235400
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
ivanraДумаю, что тут все-таки имеется прокладка EntityManager, которую можно убрать и работать напрямую через хибернейт. Не уверен, но возможно сэкономит память в 2 раза.
Почему всего в 2, а не в 10?
...
Рейтинг: 0 / 0
22.04.2013, 17:09:01
    #38235407
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
Через хэндлер можно и в Hibernate работать через IO вместо загрузки всех мегабайт в RAM.
http://turgaykivrak.wordpress.com/2008/06/06/blob-objects-with-spring-and-hibernate/
...
Рейтинг: 0 / 0
22.04.2013, 17:22:31
    #38235433
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
kastolom,

авторэксклюзивно блокирует
а вставлять в специальную таблицу + переместить запросом?
к тому же сомневаюсь, что hibernate работает как-то не через jdbc, может можно настроить так чтобы не было блокировки?
...
Рейтинг: 0 / 0
22.04.2013, 17:34:49
    #38235455
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
Лагманkastolom,
авторэксклюзивно блокирует
а вставлять в специальную таблицу + переместить запросом?
к тому же сомневаюсь, что hibernate работает как-то не через jdbc, может можно настроить так чтобы не было блокировки?
Хибер для некоторых задач пользуется временными таблицами.
Не факт что при использовании хибера не было лока. Просто автор загружал все данные в память, а при работе через JDBC - прокачивал из файловой системы, возможно, не достаточно эффективно. БОльшая задержка - явный лок.
...
Рейтинг: 0 / 0
22.04.2013, 18:47:13
    #38235565
SergeyAKM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
BlazkowiczSergeyAKMЕсть вопрос - а как же вставляет blob Hibernate, он же работает через JDBC. Hibernate что, не использует потоковое API, или открывает разу n-потоков для записи (раз так можно)?
Зависит от того какого типа свойство и от настроек хибера.

А можно уточнить, а правильно понимаю что максимум что он, hibernate, может использовать это вызвать напрямую JDBC драйвер в обход JDBC интерфейса, т.е. например не PreparedStatement, а OraclePreparedStatement?
...
Рейтинг: 0 / 0
22.04.2013, 18:49:07
    #38235568
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
SergeyAKMА можно уточнить, а правильно понимаю что максимум что он, hibernate, может использовать это вызвать напрямую JDBC драйвер в обход JDBC интерфейса, т.е. например не PreparedStatement, а OraclePreparedStatement?
Да, типа того.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]