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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> массив интов сохранить в БД, оптимизация 
:(
    Опции темы
integral
Дата 23.7.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

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



У меня есть массив интов (int[] arr), размер может быть несколько десятков тысяч. Этот массив нужно сохранить в таблицу вида create table(id int) . БД под управлением MySQL, к ней конектимся через JDBC
Вопрос состоит в том, какой самый быстрый способ такое сделать? куча последовательных инсертов не подходитsmile
всем спасибо 


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
goodday1941
Дата 23.7.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

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



Цитата(integral @  23.7.2008,  14:11 Найти цитируемый пост)
куча последовательных инсертов не подходитsmile

другого выхода кажись и нету.. главное все в одной транзакции делать


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
integral
Дата 23.7.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

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



если массив на 10000, да это же будет невероятно долго...
вот идейка есть попробовать так:
insert into tmp(id) values (?), (?), ..., (?)
и где-то 500 таких в одном PreparedStatement, лепить понятно а не вручную писать
но вот не уверен, что это действительно поможет. Тлее надежда что можно побыстрееsmile


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
AntonSaburov
Дата 23.7.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



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


Autonomous R&D
**


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

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



Код

LOAD DATA LOCAL INFILE

Смотрите внизу страницы.
PS: MySQL specific.
PM MAIL   Вверх
mbasil
Дата 28.7.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

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



Если вы не делаете поиск по некоторому конкретному элементу потом, а вам нужно одним запросом получить весь массив из базы. Я бы сохранял его в одном поле, а потом извлекал целиком. В Oracle я это делал в поле типа VARRAY. Наверное и в MySQL можно "сварганить".
Смысл есть вставлять каждое значение в отдельную строку только тогда, когда вам надо потом извлекать небольшое количество строк в рамках одного запроса.
PM MAIL   Вверх
Platon
Дата 28.7.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А может использовать естественный для таких задач тип BLOB? И пользоваться потоками сериализации.
PM MAIL ICQ   Вверх
Platon
Дата 28.7.2008, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Давно мечтал поэксперементировать с этим. Получилось ^_^

Код

CREATE TABLE `test` (
`id` INT NOT NULL AUTO_INCREMENT ,
`field` BLOB NOT NULL ,
UNIQUE (
`id`
)
) ENGINE = MYISAM ;


На запись массива

Код

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class PutIt {
    public static void main(String[] args) throws Throwable {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection =  DriverManager.getConnection("jdbc:mysql://localhost/gbook2?useUnicode=true&characterEncoding=utf-8");
        PreparedStatement st = connection.prepareStatement("INSERT INTO test SET field = ?");
        int[] data = {1,2,3,4,5,6};
        ByteArrayOutputStream boss = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(boss);
        oos.writeObject(data);
        oos.close();
        ByteArrayInputStream is = new ByteArrayInputStream(boss.toByteArray());
        st.setBlob(1, is);
        st.execute();
    }
}



Код

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.util.Arrays;

public class ReadIt {
    public static void main(String[] args) throws Throwable {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection =  DriverManager.getConnection("jdbc:mysql://localhost/gbook2?useUnicode=true&characterEncoding=utf-8");
        PreparedStatement st = connection.prepareStatement("SELECT id, field FROM test");
        ResultSet res = st.executeQuery();
        if (res.next()) {
            System.out.println("Id = " + res.getInt("id"));
            ObjectInputStream ois = new ObjectInputStream(res.getBlob("field").getBinaryStream());
            System.out.println("array = " + Arrays.toString((int[])ois.readObject()));
        }
    }
}

PM MAIL ICQ   Вверх
COVD
Дата 28.7.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



в MySQL: LOAD DATA LOCAL INFILE
в MS SQL: BULK INSERT
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.0502 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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