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

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

breath,

В файловой системе можно держать данные, если безопасники разрешат
...
Рейтинг: 0 / 0
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
    #38235059
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
    #38235093
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraЯ подробно не разбирался, поскольку блобы были не очень большие, но, по-моему, реализация получается не ленивая, то есть в селектах надо внимательно смотреть и брать блоб-поля только когда они действительно нужны.
Для ленивых свойств нужно бины инструментировать.
...
Рейтинг: 0 / 0
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
    #38235138
kastolom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
    #38235215
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
JBoss 6.1 + MSSQL 2008R2 + Blob: хранилище файлов
    #38235247
kastolom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanra,

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

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

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


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