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

Поиск:

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


software saboteur
****


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

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



Всем привет.
Пытаюсь загрузить большой файл (более 20 мб) в БД MySql
вот кусок кода:
Код

private void addNewFile(String name, File f) {
        try {
            FileInputStream fis = new FileInputStream(f);
            
            PreparedStatement stmt = connection.prepareStatement("Select * from `files`",
                    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
            stmt.execute();
            ResultSet rs = stmt.getResultSet();
            
            rs.moveToInsertRow();
            Blob blob = rs.getBlob("data");
            OutputStream os = blob.setBinaryStream(1);
            
            System.out.println("start load file: " + name);
            while (fis.available() > 0) {
                

                int block_size = 1000000;
                if (fis.available() < 1000000) {
                    block_size = fis.available();
                }
                System.out.println("try read bytes: " + block_size);
                byte b [ ] = new byte[block_size];
                
                fis.read(b);
                System.out.println("read ok, writing");
                os.write(b);
                os.flush();
                System.out.println("writing complite. check for next block...");
                System.gc(); 
            }
            System.out.println("loading file " + name + " complite.");
            os.close();
            fis.close();
            rs.updateBlob("data", blob);
            rs.updateString("name", name);
            rs.insertRow();
            stmt.close();

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

 

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

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


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


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

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


Летатель
***


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

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



Я тоже не вижу никаких проблем. Единственное предположение - реализация JDBC-драйвера такова, что накапливает в памяти все содержимое BLOB прежде чем слить в базу данных (вариант - MySQL по-другому не умеет). Точнее пока сказать не могу, файлы большого объема аплоудить не приходилось. 
PM MAIL Skype GTalk Jabber YIM   Вверх
Bulat
Дата 6.5.2006, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



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


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
powerOn
Дата 6.5.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата

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


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

 


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

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


software saboteur
****


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

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



Ура!!! Разобрался!  smile 

вот как надо большие данные загружать:

Код

private void addNewFile(String name, File f) {
        try {
            FileInputStream fis = new FileInputStream(f);
            
            PreparedStatement stmt = connection.prepareStatement("Insert Into `files` ( `name`, `data` ) values (?,?);",
                    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
            
            stmt.setString(1, name);
            stmt.setBinaryStream(2, fis, fis.available() );
            
            stmt.executeUpdate();
            stmt.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

 smile 
   


--------------------
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.1268 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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