powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно вставить ArrayList в SQL таблицу ?
25 сообщений из 39, страница 1 из 2
Как правильно вставить ArrayList в SQL таблицу ?
    #39187643
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, есть ArrayList<Object> который нужно вставить в таблицу. Структура совпадает.
Можно построчно вставлять в таблицу :
Код: java
1.
2.
3.
4.
5.
6.
List<Object> lo = new ArrayList<Object>();
for (Object obj:lo)
{PreparedStatement ps = conn.prepareStatement("INSERT INTO TABLE VALUES (?, ?, ? )");
ps.setString(1,obj.field1); 
ps.setInt(2,obj.field2); 
ps.execute();} 



Ну или batch, но это всё равно как то медленно.

Почему нету чего-то наподобие :
Код: java
1.
2.
3.
4.
List<Object> lo = new ArrayList<Object>();
PreparedStatement ps = conn.prepareStatement("INSERT INTO TABLE VALUES (?, ?, ? )");
ps.bindArray(lo);
ps.execute();} 


?
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187644
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601Ну или batch, но это всё равно как то медленно.
это не медленно. Цифры давай.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187645
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
List<Object> lo = new ArrayList<Object>();
PreparedStatement ps = conn.prepareStatement("INSERT INTO TABLE VALUES (?, ?, ? )");
for (Object obj:lo) {
  ps.setString(1,obj.field1); 
  ps.setInt(2,obj.field2); 
  ps.addBatch();
}
ps.executeBatch();
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187664
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601Допустим, есть ArrayList<Object> который нужно вставить в таблицу. Структура совпадает.
Можно построчно вставлять в таблицу :
Код: java
1.
2.
3.
4.
5.
6.
List<Object> lo = new ArrayList<Object>();
for (Object obj:lo)
{PreparedStatement ps = conn.prepareStatement("INSERT INTO TABLE VALUES (?, ?, ? )");
ps.setString(1,obj.field1); 
ps.setInt(2,obj.field2); 
ps.execute();} 



Ну или batch, но это всё равно как то медленно.

Почему нету чего-то наподобие :
Код: java
1.
2.
3.
4.
List<Object> lo = new ArrayList<Object>();
PreparedStatement ps = conn.prepareStatement("INSERT INTO TABLE VALUES (?, ?, ? )");
ps.bindArray(lo);
ps.execute();} 


?

Можно сконвертировать List<Object> в json строку и сохранить как текстовое поле.

С уважением, Валентин
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187758
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikovora601Допустим, есть ArrayList<Object> который нужно вставить в таблицу. Структура совпадает.
Можно построчно вставлять в таблицу :
Код: java
1.
2.
3.
4.
5.
6.
List<Object> lo = new ArrayList<Object>();
for (Object obj:lo)
{PreparedStatement ps = conn.prepareStatement("INSERT INTO TABLE VALUES (?, ?, ? )");
ps.setString(1,obj.field1); 
ps.setInt(2,obj.field2); 
ps.execute();} 



Ну или batch, но это всё равно как то медленно.

Почему нету чего-то наподобие :
Код: java
1.
2.
3.
4.
List<Object> lo = new ArrayList<Object>();
PreparedStatement ps = conn.prepareStatement("INSERT INTO TABLE VALUES (?, ?, ? )");
ps.bindArray(lo);
ps.execute();} 


?

Можно сконвертировать List<Object> в json строку и сохранить как текстовое поле.

С уважением, Валентин
и шо с этим делать дальше?
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187760
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601Ну или batch, но это всё равно как то медленно.

Почему нету чего-то наподобие :
Код: java
1.
2.
3.
4.
List<Object> lo = new ArrayList<Object>();
PreparedStatement ps = conn.prepareStatement("INSERT INTO TABLE VALUES (?, ?, ? )");
ps.bindArray(lo);
ps.execute();} 


?

Потому что это будет синтаксический сахар.
Т.к. все равно будет несколько строк.
"INSERT INTO TABLE VALUES (?,?,?)"
И скорость выполнения зависит от того в одной транзакции это делается или в каждой отдельно.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187801
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в н2 есть фишка импорта табличек через цсв :) но вопрос зачем? ))
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187816
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601Ну или batch, но это всё равно как то медленно.

batch не даст никакого выигрыша при добавление в таблицу одной записи.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187818
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601Почему нету чего-то наподобие :

Если вас интересует подобный синтаксис, то посмотрите Apache Commons DbUtils или Spring jdbcTemplate , но быстрее чем простой JDBC ничего не бывает.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187819
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garrickora601Почему нету чего-то наподобие :

Если вас интересует подобный синтаксис, то посмотрите Apache Commons DbUtils или Spring jdbcTemplate , но быстрее чем простой JDBC ничего не бывает.
ну есть ещё быстрее - хибер,супер быстрый...
:)
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187859
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgul...
Потому что это будет синтаксический сахар.
Т.к. все равно будет несколько строк.
"INSERT INTO TABLE VALUES (?,?,?)"
И скорость выполнения зависит от того в одной транзакции это делается или в каждой отдельно.
НЕПРАВДА

Зависит от БД
В PostgreSQL - синтаксический сахар
В Oracle - Bulk Array

IMHO & AFAIK

Для PostgreSQL - команда COPY.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187889
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevmad_nazgul...
Потому что это будет синтаксический сахар.
Т.к. все равно будет несколько строк.
"INSERT INTO TABLE VALUES (?,?,?)"
И скорость выполнения зависит от того в одной транзакции это делается или в каждой отдельно.
НЕПРАВДА

Зависит от БД
В PostgreSQL - синтаксический сахар
В Oracle - Bulk Array

IMHO & AFAIK

Для PostgreSQL - команда COPY.

А в DB2, MySqL, MS SQL H2?
Как будет?
...

Так что либо пишем запрос ориентированный на конкретную СУБД... либо... ;-)
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187900
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgul,
+100
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187904
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601, можно придумать любой библиотечный сахар для вставки арреев. Но также
нужно помнить что часть строк могут не пройти check constraint/before insert triggers
и информацию об этих сбойных строках нужно как-то вернуть.

В общем случае (in general) ты должен вернуть аррей ошибок. И не забывать про управление автокоммитом.

Код: java
1.
2.
// Несуществующий метод
List<ErrorInfo> executeBatchInsert(List<Object> lo);



Отчасти Batch updates позволяет получать инфу по ошибкам. Количество по крайней мере
точно можно узнать. Детально можно почитать в JDBC 4.1 Spec .
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187910
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton...Отчасти Batch updates позволяет получать инфу по ошибкам. Количество по крайней мере
точно можно узнать. Детально можно почитать в JDBC 4.1 Spec .

На прямых СУБД Batch updates решает и проблему производительности. Т.к. в продвинутых СУБД запросы пойдут одним пакетом и будут обработаны за один раз как одна команда.

На "кривоватых" СУБД AFAIK запросы тоже по сети должны пойти одним пакетом, но на сервере будут обрабатываться как независимый набор команд INSERT.

Наверное, есть и такие СУБД, где вообще выгоды от batch updates не будет.

Если нужна максимальная производительность, то тогда завязка на конкретную СУБД. Для PostgreSQL команда COPY. Для Oracle - всякие Direct Load (обычно не требуется). В этом случае, заливка данных будет приближаться к штатным средствам Backup / restore.

Так же можно на сервере сделать Stored Procedure, передать туда массив, вставку делать из Stored Procedure. Но мне всегда Batch updates хватало.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187911
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601Структура совпадает.
Почему нету чего-то наподобие :
Код: java
1.
2.
3.
4.
List<Object> lo = new ArrayList<Object>();
PreparedStatement ps = conn.prepareStatement("INSERT INTO TABLE VALUES (?, ?, ? )");
ps.bindArray(lo);
ps.execute();} 


?

Потому что "Структура совпадает." это очень большое заблуждение.
- Типы в Java не имеют однозначной проекции на БД
- Такое решение требует рефлексии
- Соглашения об именовании в БД и Java разные, и если в Java довольно таки общепринятые, то в БД каждый воротит свой огород

При этом существует 100500 библиотек, которые позволяют писать аналогичный код. Нытьё в стиле "Java - говно, даже такой мелочи нет" не показатель мастерства.
Ну, и что самое важное. Есть очень простое объяснение почему в Java чего-то нет. Потому что Java покрывается огромным набором тестов, чтобы гарантировать качественную и стабильную работу. Внедрение подобных бесполезных решения стабильности платформе не добавит.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39187917
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevНаверное, есть и такие СУБД, где вообще выгоды от batch updates не будет.

http://blog.jooq.org/2014/01/16/what-you-didnt-know-about-jdbc-batch/
MySQL, например, без rewriteBatchStatements.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188137
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошая ссылка. Только странно померили. Т.к. я на Oracle легко и больше 5-ти кратного ускорения добьюсь. Без сервер-сиде логики, зависимость практически линейная. Чем больше команд в пакете - тем быстрее. Т.ч. на реальных данных легко можно > 100 кратное ускорения видеть.

AFAIK без batch процессинга, более пары тысяч - десятка тысяч round trip сеть типа Ethernet (даже 10 G Ethernet) не вытянет. Latency огромное. Если массовые вставки делать отдельными командами - то прямое дорога к InifiniBand контроллерам и им подобным.

Пытался делать тест, чисто сетевые тесты (синтатика) давала max 50 тыс. roundtrips, а Oracle thin jdbc только единицы тысяч + видимые невооруженным глазом проблемы с многопотоковостью и обработкой прерываний от сетевой карты на уровне OS (Windows).
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188226
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-нибудь реверс-инжинерил batch-вставку с точки зрения Oracle JDBC (ojdbc7.jar) ?

Изначально оракл комплектуется утилитой SQLLoader которая работает только через OCI
(Oracle Call Int.) и позволяет действительно (!) грузить очень быстро (в режиме DIRECT
можно 10x) по отношению к обычной вставке.

Через JDBC нам этот пряник недоступен и соотв. возникает вопрос - а что такое собсно
батчинг с точки зрения Oracle-JDBC.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188308
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем реверсить?

Все и так понятно, документировано и работает поверх Net80, что OCI, что thin.

maytonпозволяет действительно (!) грузить очень быстро (в режиме DIRECT
можно 10x) по отношению к обычной вставке
N1:
Что есть "очень быстро" ?

На OCI в Oracle 8i мой личный загрузчик работал не намного медленнее IMP/EXP. По крайне мере упирался в проц (тогда Celeron 600) и сеть (Ethernet 10 Mbit).

Oracle thin будет незначительно медленнее, ровно на отличие Java JDBC vs native код. IMHO единицы, десятки процентов на больших обьемах. Т.е. тогда, когда подготовка/получение/генерация уже может занимать сопоставимое время собственно со вставкой.

Слова direct load мне вообще не очень понятны. У меня чувство, что под этими словами практически скрывается __только__ hint APPEND. Но это уже лучше в доке почитать.

N2:
Год назад делал перекачку > 200 Gb базы в PostgresSQL. Через COPY в text формате, скорость крайне хорошая. Даже не стал делать binary формат, т.к. понятно было, что выигрыш от этого будет очень не большой. За 4-6 часов Java переливало из Oracle в PostgreSQL.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188318
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S.
В общем, при Batch/Array процессинге, скорость должна быть сопоставима с IMP/EXP. Если разница в разы-десятки раз - профилировать и разбираться с прикладным кодом.

JDBC тут никаким "особым" узким местом являться не должен. Характеристики должны быть примерно равные OCI.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188363
alexei_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как именно работает Batch зависит от конкретного JDBC драйвера и от конкретного БД сервера.
Базовая идея там прямолинейна как грабли - строим скрипт с кучей запросов и пуляем его одним пакетом на сервер.
Понятно что если массив будет очень большим (мильён элементов, например) то результат будет совершенно печальным.

обычно JDBC драйвера не такие тупые, они не отправляет весь скрипт одним запросом к базе а бьют на куски по N запросов в каждом. И N там не особо большое (как-то типа 10), и повлиять на это N, насколько я помню, в JDBC API никак нельзя.

В итоге вы выполняете конечно на порядок, а то и на два меньше запросов к базе, сравнительно с "работой по одному" и это намного быстрей, но при больших объемах данных это все равно 100-и и 1000-и запросов и это все равно неприемлемо медленно.

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

Но, как правило когда речь идет о insert/update очень большого количества данных, то делать это приходится используя специальные средства сервера БД: прямой BULK INSERT из файла с данными и тому подобное.

У меня в практике был такие истории.
10 миллионов строк bacth-eм - два часа.
Слить данные файл -> FTP его на сервер -> BULK insert там из файла в temp-тамблицу -> update основной таблицы на основе temp -> стереть за собой весь мусор = полторы минуты на все.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188380
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexei_k,
1. Нет там такой базовой идеи
2. Данная "идея" реализуется в студенческих БД.
3. Нормальные БД, должны нормальный batch processing обеспечивать

IMHO & AFAIK
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188441
alexei_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevalexei_k,
1. Нет там такой базовой идеи
2. Данная "идея" реализуется в студенческих БД.
3. Нормальные БД, должны нормальный batch processing обеспечивать

IMHO & AFAIK
Ну... должна наверное. Однако, мы сколько-то лет назад изучали поведение JDBС драйвера Merlia c перфоманс монитором в руках и он работал именно так. За текущее положение дел сказать не берусь.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188445
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexei_kИ N там не особо большое (как-то типа 10), и повлиять на это N, насколько я помню, в JDBC API никак нельзя.

За всех не скажу, но в Orcale есть setDefaultExecuteBatch , хоть оно и Deprecated, но все ещё работает.
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно вставить ArrayList в SQL таблицу ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]