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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение больших данных из БД 
V
    Опции темы
powerOn
Дата 7.5.2006, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Привет всем!
Только я не давно разобрался с отправкой больших данных в БД, так вот теперь совершенно обратная проблема!  smile 
Падает выполнение запроса:

Код

private void saveFile(String name, File f) {
        try {
            Statement stmt = connection.createStatement();
            System.out.println("start executing query...");
            ResultSet rs = stmt.executeQuery("Select * from `files` where name= \""+ name +"\";");
            System.out.println("query execution complite...");
..................
} catch (Exception ex) {
            ex.printStackTrace();
}


Вылетает все тот же присловутый: 
Цитата

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space


Я предполагал, что при выполнении данного запроса не будет копирования больших данных из БД в память программы, это касается поля data (в запросе идет под *) имеющего тип BLOB. Но видимо копирование данных всеже происходит, и память у JVM истощается... 
что делать, ума не приложу.... 

 smile  Более того, при попытке выполнить Select к этой таблице, падает и Open Office Base с тем же исключением  smile 
драйвер к MySQL (mysql-connector-java-3.1.12-bin.jar) используется один и тот же... Может с драйвером проблема???  

Это сообщение отредактировал(а) MoonCat - 7.5.2006, 14:53


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
tux
Дата 7.5.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(MoonCat @  7.5.2006,  19:52 Найти цитируемый пост)
Может с драйвером проблема???  

Вполне возможно. Ты не пробовал в своем решении с insert загружать файлы размером в 2-3 раза больше? Мне кажется в первоначальном варианте файл не только целиком загружается в память, но еще и дублируется. Поэтому все могло сработать когда дублирование устранилось, но проблемы-то это не снимает. Вот посмотри что здесь написано - http://dev.mysql.com/doc/connector/j/en/blob.html:
Цитата
The maximum size of a BLOB or TEXT object is determined by its type, but the largest value you actually can transmit between the client and server is determined by the amount of available memory and the size of the communications buffers.

Видимо еще разбираться и разбираться. smile 
PM MAIL Skype GTalk Jabber YIM   Вверх
powerOn
Дата 7.5.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата

Ты не пробовал в своем решении с insert загружать файлы размером в 2-3 раза больше?


пробовал, 100 мб - без проблем, 250 мб - с тормозами, но загрузил. 

и еще locatorsUpdateCopy() объекта DatabaseMetaData возвращает true, т.е. 
Цитата

locatorsUpdateCopy

boolean locatorsUpdateCopy()
                           throws SQLException

    Indicates whether updates made to a LOB are made on a copy or directly to the LOB.

    Returns:
        true if updates are made to a copy of the LOB; false if updates are made directly to the LOB 
    Throws:
        SQLException - if a database access error occurs
    Since:
        1.4



я так понял, что при работе с полями типа BLOB и CLOB, изменения вносятся сначало в копию, а только потом уже в оригинал на сервере, хотя относится ли это к запросам типа SELECT не известно.... и можно ли это отключить... (?)
И еще хочется попробовать какой-нибуть другой драйвер для MySQL (может что посоветуете?), полезу в google...
  

Это сообщение отредактировал(а) MoonCat - 7.5.2006, 18:55


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
powerOn
Дата 8.5.2006, 20:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



.... Попытался решить проблему, увеличением максимально возможного Java heap space.
Запускал клиента с ключом -Xmx1024m для JVM ( java -server -Xmx1024m clientprogram.jar).

В принципе, все стало нормально работать, теперь большие файлы загружаются и скачиваются из БД. Но все равно есть вопросы, по поводу зачем столько памяти необходимо...  

P.S. : Интересным фактом остается то, что на моей машине всего 512 мб памяти, а резервировал я 1024 (-Xmx1024m)  и JVM это съела.
Видимо достаточно сказать виртуальной машине : "Ты можешь!", хотя факт этого не обеспечен, и она действительно сможет...  smile  
 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Tony
Дата 9.5.2006, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Мне кажется дело не в памати.Дело в том что если копировать фаил не 4ерез массив байтов в цикле ,а сразу закачать в памать одним массибов фаил так в 300 мегов ,то компик упадёт(что у тебя и проишодит).Тоесть нужно  както получить InputStream ot bazi и постепенно в цикле  гдето по  8kb выкачивать.Но как....? 


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
tux
Дата 9.5.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(Tony @  9.5.2006,  14:39 Найти цитируемый пост)
Мне кажется дело не в памати.Дело в том что если копировать фаил не 4ерез массив байтов в цикле ,а сразу закачать в памать одним массибов фаил так в 300 мегов ,то компик упадёт(что у тебя и проишодит).Тоесть нужно  както получить InputStream ot bazi и постепенно в цикле  гдето по  8kb выкачивать.Но как....?  

Спешу заметить, что MoonCat именно это и делает. Исходный пост здесь - http://forum.vingrad.ru/index.php?showtopic=94885. 
PM MAIL Skype GTalk Jabber YIM   Вверх
LSD
Дата 9.5.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(MoonCat @  8.5.2006,  21:55 Найти цитируемый пост)
P.S. : Интересным фактом остается то, что на моей машине всего 512 мб памяти, а резервировал я 1024 (-Xmx1024m)  и JVM это съела.
Видимо достаточно сказать виртуальной машине : "Ты можешь!", хотя факт этого не обеспечен, и она действительно сможет...

А кто сказал, что вся куча должна быть в оперативной памяти? К тому же это максимум (который не обязательно будет достигнут), вот попробуй задасть -Xms1024m увидишь, что будет.

И кстати, попробуй сделать курсор однонаправленным (хотя по идее он именно таким и должен быть). 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
powerOn
Дата 9.5.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата

А кто сказал, что вся куча должна быть в оперативной памяти? К тому же это максимум (который не обязательно будет достигнут), вот попробуй задасть -Xms1024m увидишь, что будет.


Интересно, интересно  на моей машине как я уже говорил, 512 мб оперативной памяти.
Запускаю программу с ключами: -server -Xmx1024m -Xms1024m 

программа запустилась, вывоже унформацию о памяти на экран:

Код

System.out.println(" fm: " + Runtime.getRuntime().freeMemory() +
                              " mm: " + Runtime.getRuntime().maxMemory() +
                              " tm: " + Runtime.getRuntime().totalMemory());


получаю в результате:
Цитата

 fm: 1046539464 mm: 1061814272 tm: 1061814272


Вся память ушла в файл подкачки, это видно в диспетчере задач...
  

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  task_manager.JPG 49,33 Kb


--------------------
user posted image нет времени думать - нужно писать КОД!

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

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

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


 




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


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

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