|
|
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
Допустим, есть ArrayList<Object> который нужно вставить в таблицу. Структура совпадает. Можно построчно вставлять в таблицу : Код: java 1. 2. 3. 4. 5. 6. Ну или batch, но это всё равно как то медленно. Почему нету чего-то наподобие : Код: java 1. 2. 3. 4. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 20:51 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
ora601Ну или batch, но это всё равно как то медленно. это не медленно. Цифры давай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 20:54 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 20:58 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
ora601Допустим, есть ArrayList<Object> который нужно вставить в таблицу. Структура совпадает. Можно построчно вставлять в таблицу : Код: java 1. 2. 3. 4. 5. 6. Ну или batch, но это всё равно как то медленно. Почему нету чего-то наподобие : Код: java 1. 2. 3. 4. ? Можно сконвертировать List<Object> в json строку и сохранить как текстовое поле. С уважением, Валентин ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 21:57 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
Valentin Kolesnikovora601Допустим, есть ArrayList<Object> который нужно вставить в таблицу. Структура совпадает. Можно построчно вставлять в таблицу : Код: java 1. 2. 3. 4. 5. 6. Ну или batch, но это всё равно как то медленно. Почему нету чего-то наподобие : Код: java 1. 2. 3. 4. ? Можно сконвертировать List<Object> в json строку и сохранить как текстовое поле. С уважением, Валентин и шо с этим делать дальше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 06:36 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
ora601Ну или batch, но это всё равно как то медленно. Почему нету чего-то наподобие : Код: java 1. 2. 3. 4. ? Потому что это будет синтаксический сахар. Т.к. все равно будет несколько строк. "INSERT INTO TABLE VALUES (?,?,?)" И скорость выполнения зависит от того в одной транзакции это делается или в каждой отдельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 06:50 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
в н2 есть фишка импорта табличек через цсв :) но вопрос зачем? )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 08:31 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
ora601Ну или batch, но это всё равно как то медленно. batch не даст никакого выигрыша при добавление в таблицу одной записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 09:08 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
ora601Почему нету чего-то наподобие : Если вас интересует подобный синтаксис, то посмотрите Apache Commons DbUtils или Spring jdbcTemplate , но быстрее чем простой JDBC ничего не бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 09:13 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
Garrickora601Почему нету чего-то наподобие : Если вас интересует подобный синтаксис, то посмотрите Apache Commons DbUtils или Spring jdbcTemplate , но быстрее чем простой JDBC ничего не бывает. ну есть ещё быстрее - хибер,супер быстрый... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 09:16 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
mad_nazgul... Потому что это будет синтаксический сахар. Т.к. все равно будет несколько строк. "INSERT INTO TABLE VALUES (?,?,?)" И скорость выполнения зависит от того в одной транзакции это делается или в каждой отдельно. НЕПРАВДА Зависит от БД В PostgreSQL - синтаксический сахар В Oracle - Bulk Array IMHO & AFAIK Для PostgreSQL - команда COPY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 10:08 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevmad_nazgul... Потому что это будет синтаксический сахар. Т.к. все равно будет несколько строк. "INSERT INTO TABLE VALUES (?,?,?)" И скорость выполнения зависит от того в одной транзакции это делается или в каждой отдельно. НЕПРАВДА Зависит от БД В PostgreSQL - синтаксический сахар В Oracle - Bulk Array IMHO & AFAIK Для PostgreSQL - команда COPY. А в DB2, MySqL, MS SQL H2? Как будет? ... Так что либо пишем запрос ориентированный на конкретную СУБД... либо... ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 10:55 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
mad_nazgul, +100 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 11:09 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
ora601, можно придумать любой библиотечный сахар для вставки арреев. Но также нужно помнить что часть строк могут не пройти check constraint/before insert triggers и информацию об этих сбойных строках нужно как-то вернуть. В общем случае (in general) ты должен вернуть аррей ошибок. И не забывать про управление автокоммитом. Код: java 1. 2. Отчасти Batch updates позволяет получать инфу по ошибкам. Количество по крайней мере точно можно узнать. Детально можно почитать в JDBC 4.1 Spec . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 11:12 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
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 хватало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 11:21 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
ora601Структура совпадает. Почему нету чего-то наподобие : Код: java 1. 2. 3. 4. ? Потому что "Структура совпадает." это очень большое заблуждение. - Типы в Java не имеют однозначной проекции на БД - Такое решение требует рефлексии - Соглашения об именовании в БД и Java разные, и если в Java довольно таки общепринятые, то в БД каждый воротит свой огород При этом существует 100500 библиотек, которые позволяют писать аналогичный код. Нытьё в стиле "Java - говно, даже такой мелочи нет" не показатель мастерства. Ну, и что самое важное. Есть очень простое объяснение почему в Java чего-то нет. Потому что Java покрывается огромным набором тестов, чтобы гарантировать качественную и стабильную работу. Внедрение подобных бесполезных решения стабильности платформе не добавит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 11:24 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevНаверное, есть и такие СУБД, где вообще выгоды от batch updates не будет. http://blog.jooq.org/2014/01/16/what-you-didnt-know-about-jdbc-batch/ MySQL, например, без rewriteBatchStatements. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 11:27 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
Хорошая ссылка. Только странно померили. Т.к. я на Oracle легко и больше 5-ти кратного ускорения добьюсь. Без сервер-сиде логики, зависимость практически линейная. Чем больше команд в пакете - тем быстрее. Т.ч. на реальных данных легко можно > 100 кратное ускорения видеть. AFAIK без batch процессинга, более пары тысяч - десятка тысяч round trip сеть типа Ethernet (даже 10 G Ethernet) не вытянет. Latency огромное. Если массовые вставки делать отдельными командами - то прямое дорога к InifiniBand контроллерам и им подобным. Пытался делать тест, чисто сетевые тесты (синтатика) давала max 50 тыс. roundtrips, а Oracle thin jdbc только единицы тысяч + видимые невооруженным глазом проблемы с многопотоковостью и обработкой прерываний от сетевой карты на уровне OS (Windows). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 14:46 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
Что-нибудь реверс-инжинерил batch-вставку с точки зрения Oracle JDBC (ojdbc7.jar) ? Изначально оракл комплектуется утилитой SQLLoader которая работает только через OCI (Oracle Call Int.) и позволяет действительно (!) грузить очень быстро (в режиме DIRECT можно 10x) по отношению к обычной вставке. Через JDBC нам этот пряник недоступен и соотв. возникает вопрос - а что такое собсно батчинг с точки зрения Oracle-JDBC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 15:30 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
А зачем реверсить? Все и так понятно, документировано и работает поверх 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 16:00 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
P.S. В общем, при Batch/Array процессинге, скорость должна быть сопоставима с IMP/EXP. Если разница в разы-десятки раз - профилировать и разбираться с прикладным кодом. JDBC тут никаким "особым" узким местом являться не должен. Характеристики должны быть примерно равные OCI. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 16:05 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
Как именно работает 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 -> стереть за собой весь мусор = полторы минуты на все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 16:33 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
alexei_k, 1. Нет там такой базовой идеи 2. Данная "идея" реализуется в студенческих БД. 3. Нормальные БД, должны нормальный batch processing обеспечивать IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 16:46 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevalexei_k, 1. Нет там такой базовой идеи 2. Данная "идея" реализуется в студенческих БД. 3. Нормальные БД, должны нормальный batch processing обеспечивать IMHO & AFAIK Ну... должна наверное. Однако, мы сколько-то лет назад изучали поведение JDBС драйвера Merlia c перфоманс монитором в руках и он работал именно так. За текущее положение дел сказать не берусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 17:29 |
|
||
|
Как правильно вставить ArrayList в SQL таблицу ?
|
|||
|---|---|---|---|
|
#18+
alexei_kИ N там не особо большое (как-то типа 10), и повлиять на это N, насколько я помню, в JDBC API никак нельзя. За всех не скажу, но в Orcale есть setDefaultExecuteBatch , хоть оно и Deprecated, но все ещё работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 17:30 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39187859&tid=2124285]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
192ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
92ms |
get tp. blocked users: |
1ms |
| others: | 254ms |
| total: | 591ms |

| 0 / 0 |
