|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsevmayton...что на скорость влияют engine.... 1000 строк в одной транзакции в 32 секунды это на столько мало, что выпить йяду и убиться ап стену и на работу больше не ходить но вот кто виноват и, соответственно, что делать, по форуму можно только гадать может у топик стартера связь через спутник, может БД на 5" флоппи диске... а может руки, как у задни (back) конечного (end) разработчика.... кто его знает Всяко может быть. Может у него просто плохая сетка между аппликейшеном и MariaDB. Может какой-то триггер на insert висит. Тоже надо смотреть DDL. И эти всякие ISAM/InnoDb. Но в тех ситуациях когда ничего непонятно - я беру и тупо создаю макет у себя на рабочей станции. Симулирую загрузку. И вижу к примеру что у меня в 10000 раз быстрее чем в продуктиве. Дальше - вопросы риторические. Или истерические... на тему кому на Руси жЫть хорошо... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2019, 19:47 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
pavel_nv, иногда, если нужна ещё большая скорость, можно попробовать JDBC Batch-и (чуть-чуть подправил ваш пример): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9.
Производительность при этом надо обязательно проверять. P.S. Для особых случаев (мы это делали на загрузке котировок) ещё можно подбирать размеры batch-ей и частоту commit-ов. Но это драйвер должен поддерживать. Оракловый, например, поддерживает . ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2019, 20:49 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
ОзверинMolasarпропущено... а если нет возможности формировать пакет записей? Т.е. запись в таблицу должна производиться по мере поступления. а откуда 1000 записей берется? Архитектура приложения: Отдельный сервер CentOS7 + MariaDB10.3 + ActiveMQ5 Stand-alone + Tomcat8.5 На на Tomcat запущен Async Listener, который при появлении нового сообщения в ActiveMQ5 Stand-alone тут же сохраняет его в MariaDB. Сообщения в очереди могут появляться со скоростью 1000 в секунду, а могут и 1 сообщение в секунду. Ждать промежутки времени, формируя пакеты для записи в базу, это крайний плохой вариант. Приведенный мной код - это настольное приложение на клиенте в одной сети с сервером для чистоты эксперимента. В обоих случаях запись в очередь происходит мгновенно, а последующая запись в БД 30 записей в секунду. И это запись в таблицу с одним полем!!!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 09:17 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
MolasarПриведенный мной код - это настольное приложение на клиенте в одной сети с сервером для чистоты эксперимента. В обоих случаях запись в очередь происходит мгновенно, а последующая запись в БД 30 записей в секунду. И это запись в таблицу с одним полем!!!!! Если в форуме есть хоть один специалист по БД. То он скажет что что-то здесь не то. Ты нас обманываешь. Не может в современной БД скорость DML операций быть 30 записей в секунду. Это могло быть в середине 20-го века во времена ленточных накопителей и ХДД размером с барабан. Поэтому давай приводи DDL таблицы и проект и генератор записей. Мы будем проверять и покажем тебе что на самом деле ты в чём-то ошибся. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 09:26 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
GarrickMolasarВсем привет! MariaDB 10.3 Есть таблица event_entity, в которой 1 поле id (счетчик). Счётчики обычно по-другому делаются. Ну что вы привязываетесь к деталям? Я создавал не счетчик, а облегченный вариант - таблица с одним полем, чтобы добиться максимальной производительности. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 09:30 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
mayton, +1 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 09:40 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
Molasar, тебе надо использовать PreparedStatement с rewriteBatchedStatements=true Если верить результатам их же бенчмарка: https://mariadb.com/resources/blog/mariadb-java-connector-driver-performance/ то этот параметр для батчей в 1000 записей дает лучшие результаты и на втором месте при единичных вставках. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 09:54 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
ОзверинMolasar, тебе надо использовать PreparedStatement с rewriteBatchedStatements=true Если верить результатам их же бенчмарка: https://mariadb.com/resources/blog/mariadb-java-connector-driver-performance/ то этот параметр для батчей в 1000 записей дает лучшие результаты и на втором месте при единичных вставках. а для чистоты эксперимента - проверить без всяких jdbc вставку 1000 записей на самом сервере. Интересно же. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 09:55 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
qastapavel_nv, иногда, если нужна ещё большая скорость, можно попробовать JDBC Batch-и (чуть-чуть подправил ваш пример): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9.
Производительность при этом надо обязательно проверять. P.S. Для особых случаев (мы это делали на загрузке котировок) ещё можно подбирать размеры batch-ей и частоту commit-ов. Но это драйвер должен поддерживать. Оракловый, например, поддерживает . - да это должно помочь, но на проде надо писать код сложнее. Всегда возможен такой nEvents при котором приложение упадет. Если погуглить, то найдутся примеры с "постраничным" батчем (размер батча ограничивается). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 10:36 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
Molasar+ Tomcat8.5 На на Tomcat запущен Async Listener, который при появлении нового сообщения в ActiveMQ5 Stand-alone тут же сохраняет его в MariaDB. А без Tomcat, сразу в ActiveMQ нельзя реализовать обработку входящего сообщения? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 10:38 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
ОзверинОзверинMolasar, тебе надо использовать PreparedStatement с rewriteBatchedStatements=true Если верить результатам их же бенчмарка: https://mariadb.com/resources/blog/mariadb-java-connector-driver-performance/ то этот параметр для батчей в 1000 записей дает лучшие результаты и на втором месте при единичных вставках. а для чистоты эксперимента - проверить без всяких jdbc вставку 1000 записей на самом сервере. Интересно же. Создаю таблицу с одним полем: Код: plsql 1.
Запускаю процедуру: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Результат выполнения - 30 sec ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 10:40 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
Molasar, тогда - это на другой форум уже, т.к. jdbc тут уже не причем. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 10:46 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
Molasar, Сколько раз говорить. Есть раздел фррума где обсуждают скорость вставки порядкс 40000 на ядро. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 11:30 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
Molasar Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Результат выполнения - 30 sec Мой вопрос повис в воздухе. Какой engine был использован? Как часто идёт коммит? Может для этой марии коммит это опупенно дорогая блджад операция и 30 с== 30 000 мс и скорость 30 000 / 1000 = 30 милисекунд на коммит? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 11:36 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
maytonMolasar Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Результат выполнения - 30 sec Мой вопрос повис в воздухе. Какой engine был использован? Как часто идёт коммит? Может для этой марии коммит это опупенно дорогая блджад операция и 30 с== 30 000 мс и скорость 30 000 / 1000 = 30 милисекунд на коммит? есть подозрение, что на тематическом форуме ему помогут быстрее, чем тут. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 11:37 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
maytonMolasar Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Результат выполнения - 30 sec Мой вопрос повис в воздухе. Какой engine был использован? Как часто идёт коммит? Может для этой марии коммит это опупенно дорогая блджад операция и 30 с== 30 000 мс и скорость 30 000 / 1000 = 30 милисекунд на коммит? Не знаю, все настройки по умолчанию. Что такое engine не знаю... AutoCommit enable через MySql WorkBench ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 11:43 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
Есть подозрение что автор сидит в "зоне комфорта". Он не хочет разбираться в БД. Он хочет и дальше дро..ить Java код. Но это уже вопросы управленческой психологии. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 11:46 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
MolasarВ обоих случаях запись в очередь происходит мгновенно, а последующая запись в БД 30 записей в секунду. И это запись в таблицу с одним полем!!!!! ДИСК какой? Сколько выдает IOPS. Какая очередь диска на сервере. Какие потери данных возможны. Подозреваю, что если это логи, то потеря данных при сбоях (выключили свет) совершенно не критична. К тому же, не уверен, что архитектура с ActiveMQ настроена так, что при падении ActiveMQ не будет потерь данных. Не может в современной БД скорость DML операций быть 30 записей в секунду. "Обычный" ( C ) Дося жесткий диск выдает 200-300 IOPS 300 / 30 = 10 IOPS на ТРАНЗАКЦИЮ В принципе "жирновато", но каких либо подробных данных мы не знаем. Если разгребается одним потоком: 1. Задержка сети (подозреваю минимум 2-а round trip'а /туда-обратно/ на транзакцию, insert и потом commit) 3. Если потоки уходят в фон, время включение потока в работу. На загруженном/сглючевшем сервере может занимать дофига и больше 3. Создание записи 4. Фиксация транзакции. Чистые IOPS жесткого диска 5. Если же автор еще и при этом Connection переоткрывает - то тут Станиславский был совершенно не прав. ПОЛНОСТЬЮ ВЕРЮ в 30 соединений в секунду. Ну а 1000 транзакций в секунду, как хочет автор, - это IMHO сильно НЕ мало. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 12:39 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, это очень мало. Тем более, что с большой долей вероятности никаких 1000 транзакций на выходе не будет - по умолчанию многие базы на выходе сами используют нечто вроде preparedstatements и там уже пакетно обрабатывают даже построчные операции. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 12:53 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
ОзверинLeonid Kudryavtsev, это очень мало. Тем более, что с большой долей вероятности никаких 1000 транзакций на выходе не будет - по умолчанию многие базы на выходе сами используют нечто вроде preparedstatements и там уже пакетно обрабатывают даже построчные операции. собственно по этой причине надо идти на тематический форум, т.к. тут такая масса "специалистов" по бд, что ими вадя заведует - насоветуют... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 12:54 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
Локально на моей машине MariaDB по умолчанию пишет 1000 строк за 0.468 сек. Видно проблема где-то в настройках сервера. Будем смотреть. Это уже 3-я тема "Администрирование"))) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 13:03 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
Наконец-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 13:33 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
Molasar, )) Есть метод поиска, инженерный. Не в конфигах искать а делим всю задачу пополам. Потом еще пополам. Потом ещё. Тогда на 1ой странице нашли бы неисправность. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 14:21 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
Kachalov- да это должно помочь, но на проде надо писать код сложнее. Всегда возможен такой nEvents при котором приложение упадет. Если погуглить, то найдутся примеры с "постраничным" батчем (размер батча ограничивается). падение java-процесса: во-первых, должно быть достаточно редким случаем, во-вторых для таких случаев есть специальные термины (DLQ, CLIENT_ACKNOWLEDGE и т.п.) с помощью которых настраивается повторная доставка сообщения ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 15:03 |
|
Как ускорить запись в таблицу через JDBC?
|
|||
---|---|---|---|
#18+
qastaпадение java-процесса: во-первых, должно быть достаточно редким случаем, во-вторых для таких случаев есть специальные термины (DLQ, CLIENT_ACKNOWLEDGE и т.п.) с помощью которых настраивается повторная доставка сообщения - я имел в виду OutOfMemoryError в JVM при безлимитном батче (обычно хип у JVM меньше чем max_allowed_packet в MySQL/MariaDB). В любом случае, копить слишком большой батч не стоит - это и расход системных ресурсов, и вероятность потери данных, и снижение доступности БД в момент вставки. В идеале размер батча должен увязываться с настройками БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 15:36 |
|
|
start [/forum/topic.php?fid=59&msg=39823476&tid=2121265]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
133ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 235ms |
0 / 0 |