![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
UnicornMirage |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 15.11.2005 Репутация: 1 Всего: 1 |
Приветствую всех!
Вот какой вопрос назрел на днях.. Использую СУБД MySQL 5.x, и соответственно для нее драйвер mysqlconnector один из последних (5.0.6) с оффсайта mysql. В базе данных у меня хранятся большие данные в BLOB-полях.. (порядка 1...xxx мегабайт каждое). Естественно, для их извлечения использую такую конструкцию:
посмотрел на реализацию метода com.mysql.jdbc.ResultSet.getBinaryStream(), примерно такая:
метод getNativeBinaryStream почти такой же.. что же получается - данные все равно читаются все в память в массив и затем оборачиваются в ByteArrayInputStream, где же эффективность? Это сообщение отредактировал(а) UnicornMirage - 27.9.2007, 15:10 |
||||
|
|||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
А как бы вы сделали? База данных порциями высылает строки таблицы , которые записываются в буфер. Поскольку строк может быть очень много, то обычно можно строки получать из резалтсета не дожидаясь получения всей выборки. А вот применительно к столбцу, наверное, такая схема не предполагается , т.е. столбец рассматривается как единое целое и нет механизма для считывания по мере получения. Может, в других базах по-другому, а для опенсурс продукта это простительно.
Это сообщение отредактировал(а) COVD - 27.9.2007, 15:34 |
|||
|
||||
UnicornMirage |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 15.11.2005 Репутация: 1 Всего: 1 |
я как раз предполагал, что СУБД может возвратить указатель/ссылку на поток данных прямо из поля таблицы, чтобы читать из него порциями. Поэтому как это сделано в MySQL для меня явилось откровением... ![]() |
|||
|
||||
Vasay |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2097 Регистрация: 8.3.2006 Репутация: 11 Всего: 73 |
Я могу ошибаться....
Но, как мне кажется, это наиболее правильный вариант. Допустим Вам возвращали бы ссылку на данные. Тогда, в случае, если ваша программа "тормозит", то, варианты: 1. базе данных пришлось бы блокировать запись на изменение, что могло вызвать серьезные тормоза у других клиентов. 2. Базе данных пришлось бы выгружать для Вас данные в отдельный буфер, но тогда, если запросов было бы много и для каждого создавался бы буфер, база неэффективно использовала бы память. 3. (Возможно, вполне логичный вариант) База создавала бы буфер, в том случае если происходят изменения, и скидывала бы в буфер неизмененне данные для тех, кто уже качает. ИМХО Не стоит хранить в базе большие данные, а только ссылку на то место, откуда их можно взять. -------------------- Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны. |
|||
|
||||
UnicornMirage |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 15.11.2005 Репутация: 1 Всего: 1 |
настолько глубоко в СУБД не разбираюсь, но Ваша логика мне кажется верной. тогда видимо придется немного перепроектировать схему данных, исходя из этих слов:
и возникает еще один вопрос - а каковы границы этого "большого" и "малого" для данных? полагаю что это будет зависеть от таких факторов также, как: - размер памяти для VM, чтобы можно было прочитать эти данные в byte[] - загрузка сервера (сколько потоков могут одновременно читать эти byte[]) - ну и т.п. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |