powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно вставить ArrayList в SQL таблицу ?
39 сообщений из 39, показаны все 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
Как правильно вставить ArrayList в SQL таблицу ?
    #39188457
alexei_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garrickalexei_kИ N там не особо большое (как-то типа 10), и повлиять на это N, насколько я помню, в JDBC API никак нельзя.

За всех не скажу, но в Orcale есть setDefaultExecuteBatch , хоть оно и Deprecated, но все ещё работает.
Deprecated и должно работать. Но вообще круто. :) Похоже в актуальной версии JDBC спеки они что-то подстелили под проблему. Надо было бы поковыряется...
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188476
golovonometr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 -> стереть за собой весь мусор = полторы минуты на все.

похоже вы его использовали не верно или железо дореволюционное было как на сервере, так на клиенте.

2,5 миллиона строк с 85-ю колонок разнотипных данных из файла в базу с разбором данных залетают за 2,5 минуты... Весит это барахло 2,2 Гб в текстовом виде. База оракловая. PreparedStatement, JDBC addBatch... Если честно (совсем откровенно) то распаковка такого файла (данные поступают в архивах), у меня больше времени занимает чем разбор и вставка в базу.

Кстати на счет N, то похоже на бред, я конечно не знаю как на низком уровне пакеты делятся (на уровне общения сетевых устройств). Но на высоком - делить вы можете сами, я по 1000 делил например. Почему именно 1000, опытным путем получил оптимальное число под мою систему, которое не так сильно влияет на память и меня устраивает по производительности.

Покажите ваш код, с момента где вы получили коннекшн (без автокоммита), создали ваш препаред, запихали туда данных и батч. Уверен тормоза где-то между ними.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188486
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я когда свой загрузчик сделал, кол-во на батч вычислял как N МегаБайт под буфер / M размер одной записи. На больших размерах пакетов начинает тормозить система, маленькие не эффективны. Но у нас в основном таблицы-связки (N:N) заливались, там мало коротких полей и много записей.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188493
alexei_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну значит Oracle и его JDBC драйвер умеют решать проблему по-умному. Респект Oracle-у, недаром столько стоит.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188590
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevСлова direct load мне вообще не очень понятны. У меня чувство, что под этими словами практически скрывается __только__ hint APPEND. Но это уже лучше в доке почитать.

Начну с середины. Буду каментить пока по тому где есть мысли.

Про Direct Path Load пишут здесь.

http://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_modes.htm#i1008815 Direct Path Load

Instead of filling a bind array buffer and passing it to the Oracle database
with a SQL INSERT statement, a direct path load uses the direct path API
to pass the data to be loaded to the load engine in the server. The load
engine builds a column array structure from the data passed to it.

The direct path load engine uses the column array structure to format
Oracle data blocks and build index keys. The newly formatted database
blocks are written directly to the database (multiple blocks per I/O
request using asynchronous writes if the host platform supports
asynchronous I/O).

Internally, multiple buffers are used for the formatted blocks. While
one buffer is being filled, one or more buffers are being written if
asynchronous I/O is available on the host platform. Overlapping
computation with I/O increases load performance.

Работает действительно быстро. Насчёт 10х кратного ускорения возможно я погорячился
но в 2 и более раз будет. К сожалению есть ограничения. Direct Path ЕМНИП
поддерживается для базовых типов данных таких как NUMBER/VARCHAR2/DATE.

По поводу hint append. Мы проводили эксперимент на 10g и пришли к выводу
что хинт +APPEND выгоден на массовых операциях где на один оператор INSERT
фактически идёт вставка более чем 1-й строки (INSERT .... SELECT ...).
В других случаях он не имеет полезного эффекта.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188686
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем, посмотрев на stackoverflow, здесь, пришел к выводу что лучше чем batch в джаве ничего быстрее нету(а может и правильно). Для PostgreSQL есть COPY (он кстати работает быстрее чем батч), но если переливать данные с одной базы в другую, как то не красиво экспортировать её в csv на клиент :)

Возможно неплохо было бы иметь direct path возможность в execute().

PS append hint=direct path.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188693
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexei_kБазовая идея там прямолинейна как грабли - строим скрипт с кучей запросов и пуляем его одним пакетом на сервер.
Понятно что если массив будет очень большим (мильён элементов, например) то результат будет совершенно печальным.

Да. Я тоже думаю что эффект batch базируется на оптимизации сетевого взаимодействия.
Только вот размер пачки будет зависеть от самих данных и его скорее всего надо подбирать
экспериментально.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188753
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Oracle доке не всегда можно верить. Разбирался (на коммерческой основе) с Array fetch / batch операциями с Blob'ами на Java Thin JDBC - дока во многих местах противоречит друг другу и/или содержит заведомо устаревшие сведения.
Ряд возможностей вообще были найдены только в секции new futures для JDBC. В самой доке описание флагов отсутствовало.

2. Это я читал, но когда плотно столкнулся в начале 2000-х (Oracle 8.1.5, MS VS C, OCI) это выглядело как "у нас есть супер оружие, но мы вам не покажем" ( C )

Ровно так Bulk insert и работает. Готовим буфер, выполняем Insert. Ограничения по типам - сейчас уже не уверен. Раньше Array fetch/bulk операции не поддерживали BLOB'ы, сейчас с 11-ых версий (сервер вроде с 10.1 /частично/-11.1, JDBC с 11.2/ BLOB'ы поддерживаются.

3. Разумеется, хинт APPEND имеет смысл только для _массовых_ операциях. Мы о них сейчас и говорим. Мало того, в ряде случаев он крайне ВРЕДЕН (при неумеренном использовании не по делу, может вызвать дикую фрагментацию таблицы и положить Oracle).

БЫЛ НЕ ПРАВ. Почитал описание JDBC драйверов от MS, там таже уверяют, что просто выполняем кучу независимых команд и делаем Batch. Я так никогда не делал. Всегда делал PreparedStatement и уже операции с ним. Вообще всегда только через PreparedStatement работаю.

4. По документации Oracle JDBC содержит/содерЖАЛ паралельно 2-е технологии: Java JDBC array fetch/bulk, "native Oracle". Чем конкретно они различаются - в доке не написано и, вообще, опции относящиеся к этим обеим технологиям описаны очень куце и противоречиво (специально искал все связанное с BLOB). Выбор режима в ряде случаев просто параметром.

Единственная осмысленная рекомендация в доках "не смешивайте и тот и тот вариант в одной программе"

На практике, IMHO по скорости РАЗНИЦЫ НЕ ВИДНО (на моем коде, см. выше). Кроме того, методы "native Oracle" в каждой версии все больше и больше deprecated. Т.ч. есть подозрении, что внутри одно и то же.

Возможно, для ранних драйверов (особенно, когда использовался OCI драйвер) - различия и были. Сейчас - сильно сомневаюсь. Если раньше OCI драйвер рекомендовался как "он быстрее", то сейчас сам Oracle Co. рекомендует всегда использовать Thin. В том числе, так как он стал быстрее OCI. IMHO & AFAIK
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188762
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601..Для PostgreSQL есть COPY (он кстати работает быстрее чем батч), но если переливать данные с одной базы в другую, как то не красиво экспортировать её в csv на клиент
Нафига что-то держать на клиенте?

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

Изначально хотел делать binary формат, потом посмотрев загрузку на сервере, понял, что для меня выгоды binary / text особой не будет. Т.ч. даже заморачиваться не стал.

IMHO & AFAIK У PostgreSQL COPY выглядит просто "bulk" вариантом команды INSERT. Если я правильно помню AFAIK, она даже меннее специфическая, чем Oracle хинт /*+ append*/ (у Oracle INSERT + append есть ограничения по использованию в пределах транзакций, у PostgreSQL COPY вроде никаких ограничений нет).

Как я понимаю, просто не сделаны/реализованы нормальны PreparedStatement'ы, вот и пришлось костыль в виде COPY сооружать.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188767
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INSERT /*+ append */ с JDBC не смотрел, потребности не было. Т.ч. точно ничего сказать не могу. Нужно смотреть и проверять. Сейчас Oracle под рукой нет, да и интерес чисто академический.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39188775
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev...
На практике, IMHO по скорости РАЗНИЦЫ НЕ ВИДНО (на моем коде, см. выше)...

Беглым поиском в И-нет наткнулся на статью:
https://venzi.wordpress.com/2007/11/28/prepared-statement-in-batch-mode-vs-forall-in-plsql/

Человек сравнил Insert через Java batch и хитровывернутый anonymous PL/SQL блок с честным PL/SQL BULK INSERT.

Просто Insert через Java batch оказался быстрее. Никакие хитровывернутые пляски в современных драйверах нафиг не нужны.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39189092
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один из самых быстрых способов загрузки в Oracle из CSV в качестве примера я приводил здесь

Тяпничная география
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39189183
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПо поводу hint append. Мы проводили эксперимент на 10g и пришли к выводу
что хинт +APPEND выгоден на массовых операциях где на один оператор INSERT
фактически идёт вставка более чем 1-й строки (INSERT .... SELECT ...).
В других случаях он не имеет полезного эффекта.
Ну так в документации же написано было
The APPEND hint is only supported with the subquery syntax of the INSERT statement, not the VALUES clause.

Другим словами, чтоб заставить его работать можно, как было указано выше, сериализовать в джаве каждый объект в строку (если влезает в 4000 байт), передать в запрос через типизированный массив, ну например SYS.ODCIVARCHAR2LIST, и сделать insert ... select from table(...). Если строк много то сделать теми же порциями с переиспользованием preparedSatatement.
...
Рейтинг: 0 / 0
Как правильно вставить ArrayList в SQL таблицу ?
    #39189200
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Беглым поиском находится еще хинт APPEND_VALUES (с 11g release 2).

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


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