Stream blobs: можно юзать или лучше не стоит?
Модератор: kdv
Stream blobs: можно юзать или лучше не стоит?
Пишу приложение, используется Firebird embedded 1.5.3-win32 + IBPP.
сейчас дело дошло до полей blob. В блобах будут сохраняться бинарные данные (аудио в нестандартном формате), на чтение обязательно нужен потоковый доступ с возможностью позиционирования. Возможный объем данных в одном блобе - от единиц килобайт до десятков мегабайт (типовая запись ~0,2-0,5Мб), общий объем ограничен лишь степенью маниакальности юзера и объемом винчестера в его распоряжении. На первый взгляд для моих целей хорошо подходят Stream blobs.
Хочется узнать, нет ли в Firebird каких-либо граблей при использовании stream blobs, например:
* багов при резервном копировании и ремонте БД;
* не будет ли катастрофмчески разрастаться объем БД при наличии большого количества уничтоженных многомегабайтных blob;
* другие проблемы?
сейчас дело дошло до полей blob. В блобах будут сохраняться бинарные данные (аудио в нестандартном формате), на чтение обязательно нужен потоковый доступ с возможностью позиционирования. Возможный объем данных в одном блобе - от единиц килобайт до десятков мегабайт (типовая запись ~0,2-0,5Мб), общий объем ограничен лишь степенью маниакальности юзера и объемом винчестера в его распоряжении. На первый взгляд для моих целей хорошо подходят Stream blobs.
Хочется узнать, нет ли в Firebird каких-либо граблей при использовании stream blobs, например:
* багов при резервном копировании и ремонте БД;
* не будет ли катастрофмчески разрастаться объем БД при наличии большого количества уничтоженных многомегабайтных blob;
* другие проблемы?
по поводу "разрастаться" - как ни крути, блоб любого типа подвержен транзакционности, т.е при обновлении блоба ВСЕГДА будет создаваться в новой версии его копия, потоковый это блоб или нет.
кроме того, вроде как streamed blob нигде кроме fb 2 нет возможности использовать, да и там кажется не все гладко.
кроме того, вроде как streamed blob нигде кроме fb 2 нет возможности использовать, да и там кажется не все гладко.
Обновлений блобов не будет. Блоб 1 раз создается, потом произвольное количество раз читается в режиме произвольного доступа, после чего уничтожается (юзером или автоматически по устареванию).kdv писал(а):по поводу "разрастаться" - как ни крути, блоб любого типа подвержен транзакционности, т.е при обновлении блоба ВСЕГДА будет создаваться в новой версии его копия, потоковый это блоб или нет.
кроме того, вроде как streamed blob нигде кроме fb 2 нет возможности использовать, да и там кажется не все гладко.
2Гб на каждый блоб или на все блобы в БД?dimitr писал(а):позиционирование в stream-блобах ограничено 2ГБ
Немного поэкспериментировал и теперь сижу в непонятках.
У меня не получилось создать stream blob средcтвами API (в соответсвии с http://www.ibphoenix.com/main.nfs?a=ibp ... tream_blob' ).
Создаю блоб функцией Bopen c c параметром "w", пишу - putx, закрываю - BLOB_close.
Все работает, бинарные данные пишутся и читаются правильно, только блоб создается сегментированный, а не потоковый.
isc_seek_blob соотвественно не работает ругается "invalid handle", isc_blob_info рапортует, что блоб сегментированный, смотрел дамп fdb файла - четко просмативется сегментированность и заголовки сегментов.
Как все-таки правильно создавать и открывать stream blob средствами API?
У меня не получилось создать stream blob средcтвами API (в соответсвии с http://www.ibphoenix.com/main.nfs?a=ibp ... tream_blob' ).
Создаю блоб функцией Bopen c c параметром "w", пишу - putx, закрываю - BLOB_close.
Все работает, бинарные данные пишутся и читаются правильно, только блоб создается сегментированный, а не потоковый.
isc_seek_blob соотвественно не работает ругается "invalid handle", isc_blob_info рапортует, что блоб сегментированный, смотрел дамп fdb файла - четко просмативется сегментированность и заголовки сегментов.
Как все-таки правильно создавать и открывать stream blob средствами API?
Что-то типа этого :3m писал(а):Как все-таки правильно создавать и открывать stream blob средствами API?
Код: Выделить всё
const char bpb[] = {isc_bpb_version1, isc_bpb_type, isc_bpb_type_stream};
...
isc_create_blob2(..., sizeof(bpb), bpb)
Уже разобрался, stream blob создается именно так, но чтобы писать в поток после isc_create_blob2 надо повторить все, что делается в функции Bopen (файл jrd\utl.cpp по исходнику FB1.5.3.4870).hvlad писал(а):Что-то типа этого :3m писал(а):Как все-таки правильно создавать и открывать stream blob средствами API?Код: Выделить всё
const char bpb[] = {isc_bpb_version1, isc_bpb_type, isc_bpb_type_stream}; ... isc_create_blob2(..., sizeof(bpb), bpb)
Еще выяснилось, чт isc_seek_blob не считывает в буфер новые данные и чтобы позиционирование работало надо обнулить blob_stream->bstr_cnt, тогда следующий getb считает новые данные.
Сегодня писал тесты, пока ничего плохого не обнаружил.
Удручает полное отсутсвие документации по stream blobs. Непонятно, как люди пишут всякие компоненты для FB с поддержкой потоковых блобов.
Дык3m писал(а):Уже разобрался, stream blob создается именно так,hvlad писал(а):Что-то типа этого :3m писал(а):Как все-таки правильно создавать и открывать stream blob средствами API?Код: Выделить всё
const char bpb[] = {isc_bpb_version1, isc_bpb_type, isc_bpb_type_stream}; ... isc_create_blob2(..., sizeof(bpb), bpb)

Зачем вообще туда было смотреть ? BSTREAM совсем не обязателен к использованию. Я вообще не нашёл где это используется и для чего эти ф-ции в utl.cpp нужны. Какие-то осколки непонятно от чего3m писал(а):но чтобы писать в поток после isc_create_blob2 надо повторить все, что делается в функции Bopen (файл jrd\utl.cpp по исходнику FB1.5.3.4870).
Вся необходимая документация состоит из 2-х пунктов - как создавать (выше) и то, что с ним seek работает. Это всё. В остальном stream blob не отличается от segmented3m писал(а):Удручает полное отсутсвие документации по stream blobs.
Не знаю таких3m писал(а):Непонятно, как люди пишут всякие компоненты для FB с поддержкой потоковых блобов.
Тем не менее если бы не ошибка в Bopen при создании блоба то все работало бы как задумывалось. (туда всего-то нужно добавить const char bpb[] = {isc_bpb_version1, isc_bpb_type, 1, isc_bpb_type_stream};).hvlad писал(а):...
BSTREAM совсем не обязателен к использованию. Я вообще не нашёл где это используется и для чего эти ф-ции в utl.cpp нужны. Какие-то осколки непонятно от чего
Использование BSTREAM освобождает от необходимости написания аналогичного кода для буферизации при чтении/записи по одному байту. Если в приложении операции блочные - тогда согласен, BSTREAM не нужен.
Firebird PHP5 API (http://www.janus-software.com), jaybird jdbc driver и по моему есть еще среди коммерческих.hvlad писал(а):Не знаю таких3m писал(а):Непонятно, как люди пишут всякие компоненты для FB с поддержкой потоковых блобов.