Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация mysqlconnector. getBinaryInputStream vs getBytes 
:(
    Опции темы
UnicornMirage
Дата 27.9.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 15.11.2005

Репутация: 1
Всего: 1



Приветствую всех!
Вот какой вопрос назрел на днях..
Использую СУБД MySQL 5.x, и соответственно для нее драйвер mysqlconnector один из последних (5.0.6) с оффсайта mysql.
В базе данных у меня хранятся большие данные в BLOB-полях.. (порядка 1...xxx мегабайт каждое).
Естественно, для их извлечения использую такую конструкцию:



Код

ResultSet rs = connection.executeQuery("SELECT data FROM sometable WHERE ...");
if(rs.next()) {
    InputStream is = rs.getBinaryStream(1);
    // далее перенаправляю is в выходной поток, куда потребуется...
}


посмотрел на реализацию метода com.mysql.jdbc.ResultSet.getBinaryStream(), примерно такая:
Код

public InputStream getBinaryStream(int columnIndex) throws SQLException {
  checkRowPos();
     if(!isBinaryEncoded) {
           byte b[] = getBytes(columnIndex);
          if(b != null)
             return new ByteArrayInputStream(b);
           else
             return null;
                } else {
         return getNativeBinaryStream(columnIndex);
                }
            }


метод getNativeBinaryStream почти такой же.. что же получается - данные все равно читаются все в память в массив и затем оборачиваются в ByteArrayInputStream, где же эффективность?

Это сообщение отредактировал(а) UnicornMirage - 27.9.2007, 15:10
PM MAIL   Вверх
COVD
Дата 27.9.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



А как бы вы сделали? База данных порциями высылает строки таблицы , которые записываются в буфер. Поскольку строк может быть очень много, то обычно можно строки получать из резалтсета не дожидаясь получения всей выборки. А вот применительно к столбцу, наверное, такая схема не предполагается , т.е. столбец рассматривается как единое целое и нет механизма для считывания по мере получения. Может, в других базах по-другому, а для опенсурс продукта это простительно.

Это сообщение отредактировал(а) COVD - 27.9.2007, 15:34
PM MAIL   Вверх
UnicornMirage
Дата 27.9.2007, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 15.11.2005

Репутация: 1
Всего: 1



Цитата

А как бы вы сделали?

я как раз предполагал, что СУБД может возвратить указатель/ссылку на поток данных прямо из поля таблицы, чтобы читать из него порциями. Поэтому как это сделано в MySQL для меня явилось откровением... smile
PM MAIL   Вверх
Vasay
Дата 27.9.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

Репутация: 11
Всего: 73



Я могу ошибаться....

Но, как мне кажется, это наиболее правильный вариант. 
Допустим Вам возвращали бы ссылку на данные. Тогда, в случае, если ваша программа "тормозит", то, варианты:
1. базе данных пришлось бы блокировать запись на изменение, что могло вызвать серьезные тормоза у других клиентов. 
2. Базе данных пришлось бы выгружать для Вас данные в отдельный буфер, но тогда, если запросов было бы много и для каждого создавался бы буфер, база неэффективно использовала бы память.
3. (Возможно, вполне логичный вариант) База создавала бы буфер, в том случае если происходят изменения, и скидывала бы в буфер неизмененне данные для тех, кто уже качает.

ИМХО Не стоит хранить в базе большие данные, а только ссылку на то место, откуда их можно взять.


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
UnicornMirage
Дата 27.9.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 15.11.2005

Репутация: 1
Всего: 1



Цитата

1. базе данных пришлось бы блокировать запись на изменение, что могло вызвать серьезные тормоза у других клиентов. 
2. Базе данных пришлось бы выгружать для Вас данные в отдельный буфер, но тогда, если запросов было бы много и для каждого создавался бы буфер, база неэффективно использовала бы память.
3. (Возможно, вполне логичный вариант) База создавала бы буфер, в том случае если происходят изменения, и скидывала бы в буфер неизмененне данные для тех, кто уже качает.


настолько глубоко в СУБД не разбираюсь, но Ваша логика мне кажется верной.
тогда видимо придется немного перепроектировать схему данных, исходя из этих слов:
Цитата

ИМХО Не стоит хранить в базе большие данные, а только ссылку на то место, откуда их можно взять.

и возникает еще один вопрос - а каковы границы этого "большого" и "малого" для данных? 
полагаю что это будет зависеть от таких факторов также, как: 
- размер памяти для VM, чтобы можно было прочитать эти данные в byte[]
- загрузка сервера (сколько потоков могут одновременно читать эти byte[])
- ну и т.п.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0653 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.