powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Как ускорить запись в таблицу через JDBC?
53 сообщений из 53, показаны все 3 страниц
Как ускорить запись в таблицу через JDBC?
    #39822986
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

MariaDB 10.3
Есть таблица event_entity, в которой 1 поле id (счетчик).

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
public class MariaDBTest {
    
    private static final int nEvents = 1000;
    
    private static final String url 
            = "jdbc:mariadb://192.168.0.158:3306/scjms_db";
    private static final String driver = "org.mariadb.jdbc.Driver";
    private static final String user = "root";
    private static final String password = "root";
    private static Connection connection = null;
    private static Statement statement = null;
    
    public static void main(String[] args) 
            throws SQLException, ClassNotFoundException {
        Class.forName(driver);
        connection = DriverManager.getConnection(
                url, user, password);
        statement = connection.createStatement();
        
        String sqlQuery = "insert into event_entity () values ()";
        
        long start = System.currentTimeMillis();
        for (int i = 0; i < nEvents; i++) {
            statement.execute(sqlQuery);
        }
        System.out.println("Saving of " + nEvents + " events takes " 
                        + (System.currentTimeMillis() - start));      
        
        statement.close();
        connection.close();
    }

}


авторSaving of 1000 events takes 35120
Добавление 1000 записей отбирает целых 35 сек драгоценного времени(((((
Как ускорить запись в таблицу?
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39822987
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,
читай доки на
insert into .... values ()
и столько надо вставлять из csv файла
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39822990
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823000
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинMolasar,

https://google.gik-team.com/?q=jdbc preparedstatement batch insert
а если нет возможности формировать пакет записей?
Т.е. запись в таблицу должна производиться по мере поступления.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823002
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяMolasar,
читай доки на
insert into .... values ()
и столько надо вставлять из csv файла
Читал про insert into .... values ().
Нет возможности вставлять из csv файла. Запись в таблицу необходимо делать по мере поступления данных.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823008
pavel_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasarа если нет возможности формировать пакет записей?
Т.е. запись в таблицу должна производиться по мере поступления.

Используй очередь, например blockingQueue и отдельный поток для записи, если нет страха потерять данные (т.к. выйдешь из транзакции, если используешь их). ну или какой нибудь другой буфер.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823012
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavel_nvMolasarа если нет возможности формировать пакет записей?
Т.е. запись в таблицу должна производиться по мере поступления.

Используй очередь, например blockingQueue и отдельный поток для записи, если нет страха потерять данные (т.к. выйдешь из транзакции, если используешь их). ну или какой нибудь другой буфер.
Я уже использую ActiveMQ.
Как ускорить запись в БД? Может Pool какой использовать?
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823017
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarМожет Pool какой использовать?разве ещё не используешь?
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823018
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarОзверинMolasar,

https://google.gik-team.com/?q=jdbc preparedstatement batch insert
а если нет возможности формировать пакет записей?
Т.е. запись в таблицу должна производиться по мере поступления.

По мере поступления тоже можно использовать batch, т.е. копить записи в буфере, а потом вставлять пачкой - это быстрее чем по одной. Так же не понял как вы формируете sqlQuery, но надеюсь про Prepared Statement вы в курсе. Или нет? Это много быстрее чем строки клеить.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823021
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasarpavel_nvпропущено...


Используй очередь, например blockingQueue и отдельный поток для записи, если нет страха потерять данные (т.к. выйдешь из транзакции, если используешь их). ну или какой нибудь другой буфер.
Я уже использую ActiveMQ.
Как ускорить запись в БД? Может Pool какой использовать?
Никакой Pool на скорость INSERT не влияет, Pool он для другого.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823023
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,
Вперед в ветку обсуждение бд.
Там миллионы за секунду вставляют.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823025
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GarrickПо мере поступления тоже можно использовать batch, т.е. копить записи в буфере, а потом вставлять пачкой - это быстрее чем по одной. Так же не понял как вы формируете sqlQuery, но надеюсь про Prepared Statement вы в курсе. Или нет? Это много быстрее чем строки клеить.

1. Поддерживаю.
2. Prepared Statement в нормальных СУБД (My SQL к ним не относится) будет не только быстрее, но и требовать значительно меньше ресурсов на сервере.
note: Но для My SQL, и batch и PreparedStatemt все равно будут просто "строки клеить" ))) AFAIK
3. ТС не написал, какой канал до сервера и какие задержки. Если связь через спутниковый модем 2400 бод - то законы физики (информация не может передаваться быстрее. чем скорость света в вакууме) обойти не получится
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823026
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда упрешся, будешь писать просто в файл двоичный.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823027
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GarrickНикакой Pool на скорость INSERT не влияет, Pool он для другого.на саму скорость не влияет, но не известно что у ТС в реальности, а не на приведённом примере. если есть ожидание - то возможно он для каждого инсерта создаёт подключение...
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823033
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarВсем привет!

MariaDB 10.3
Есть таблица event_entity, в которой 1 поле id (счетчик).


Счётчики обычно по-другому делаются.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823035
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяGarrickНикакой Pool на скорость INSERT не влияет, Pool он для другого.на саму скорость не влияет, но не известно что у ТС в реальности, а не на приведённом примере. если есть ожидание - то возможно он для каждого инсерта создаёт подключение...
Тогда да, на скорость повторного подключения влияет.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823039
pavel_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarЯ уже использую ActiveMQ.
Как ускорить запись в БД? Может Pool какой использовать?

1) Тебе говорят же пиши пачками.

Много консьюмеров будут писать в queue,
а отдельный поток допустим раз в 5 секунд брать всю эту очередь и записывать в БД батчем (java.sql.Statement#executeBatch)

или посмотри в сторону batchConsume в ActiveMQ, если там такое поддерживается.



2) Во вторых у тебя в коде скорее всего каждый запрос выполняется в своей транзакции - логичнее выполнять несколько записей в одной транзакции, используя preparedStatement - это быстрее - будет как-то так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
connection.setAutoCommit(false);
String sqlQuery = "insert into event_entity (x,y,z) values (?,?,?)";
PreparedStatement statement = connection.prepareStatement(sqlQuery);
for (int i = 0; i < nEvents; i++) {
    statement.setInt(1,x[i]);
    statement.setLong(2,y[i]);
    statement.setString(3,z[i]);
    statement.executeUpdate();
 }
        
statement.close();
connection.commit();
connection.close();
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823060
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarОзверинMolasar,

https://google.gik-team.com/?q=jdbc preparedstatement batch insert
а если нет возможности формировать пакет записей?
Т.е. запись в таблицу должна производиться по мере поступления.

а откуда 1000 записей берется?
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823061
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasarpavel_nvпропущено...


Используй очередь, например blockingQueue и отдельный поток для записи, если нет страха потерять данные (т.к. выйдешь из транзакции, если используешь их). ну или какой нибудь другой буфер.
Я уже использую ActiveMQ.
Как ускорить запись в БД? Может Pool какой использовать?
Не нужен тебе никакой АктивМК.

Сначала надо попробовать простыми средствами улучшить. Про пачки тебе правильно сказали.
Но что еще влияет на скорость. Архитектура таблички. Я не спец в МарияДб. Но если это наследник
MySQL то из его оптимизации мы помним что на скорость влияют engine. По сути это DDL как создана табличка.

Вот тут рекомендации по выбору.

https://mariadb.com/kb/en/library/choosing-the-right-storage-engine/

Вот тут еще какие-то советы как подготовить табличку к загрузке

https://mariadb.com/kb/en/library/how-to-quickly-insert-data-into-mariadb/
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823065
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarДобавление 1000 записей отбирает целых 35 сек драгоценного времени(((((
Твой бенчмарк не показывает ровным счетом ничего. Какой-то кусок кода работает на твоей тачке 35 секунд, и что?
Если хочешь чтобы тебе помогли - расскажи какая перед тобой конкретно стоит задача и что конкретно не получается. По уровню твоих вопросов видно, что задача эта не твоего уровня и скорее всего ты ее интерпретировал неправильно, а возможно и просто придумал. Для начала можешь почитать Шипилева о том как надо правильно писать бенчмарки.
MolasarКак ускорить запись в таблицу?

Сменить базу. А если серьезно то по твоему огрызку кода вообще непонятно что тебе надо, больше похоже на юнит тест какой-то. Если это бизнес-логика, то начать надо с переписания ее с нуля
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823066
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton...что на скорость влияют engine....
1000 строк в одной транзакции в 32 секунды это на столько мало, что выпить йяду и убиться ап стену и на работу больше не ходить

но вот кто виноват и, соответственно, что делать, по форуму можно только гадать

может у топик стартера связь через спутник, может БД на 5" флоппи диске... а может руки, как у задни (back) конечного (end) разработчика.... кто его знает
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823070
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинMolasarпропущено...

а если нет возможности формировать пакет записей?
Т.е. запись в таблицу должна производиться по мере поступления.

а откуда 1000 записей берется?события биллинга пишет
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823071
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

согласен, с такой скорости 10 индусов бы руками быстрее вставили
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823072
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar
Код: java
1.
2.
3.
...
onnection = DriverManager.getConnection( , user, password);
...


Господа, напомните мне пожалуйсто, а какое by default значение Auto Commit в My SQL и Java ?

Если речь не о 1000 строк, а о 1000 транзакций, то тогда тем более вопрос:
1) Что за железо на сервере
2) Сколько оно может выдать IOPS
3) и самый главный ПРИ ЧЕМ, Б#$%, ТУТ JAVA ?
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823074
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev3) и самый главный ПРИ ЧЕМ, Б#$%, ТУТ JAVA ?ну, как минимум, вставка идет в цикле на java. для большей точности надо определить время не по всему циклу, а время каждой вставки, взять минимальное и максимальное, и не только для 1000, а 5000, 10000
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823076
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevmayton...что на скорость влияют engine....
1000 строк в одной транзакции в 32 секунды это на столько мало, что выпить йяду и убиться ап стену и на работу больше не ходить

но вот кто виноват и, соответственно, что делать, по форуму можно только гадать

может у топик стартера связь через спутник, может БД на 5" флоппи диске... а может руки, как у задни (back) конечного (end) разработчика.... кто его знает
Всяко может быть. Может у него просто плохая сетка между аппликейшеном и MariaDB.
Может какой-то триггер на insert висит. Тоже надо смотреть DDL. И эти всякие ISAM/InnoDb.

Но в тех ситуациях когда ничего непонятно - я беру и тупо создаю макет у себя на рабочей
станции. Симулирую загрузку. И вижу к примеру что у меня в 10000 раз быстрее чем в продуктиве.

Дальше - вопросы риторические. Или истерические... на тему кому на Руси жЫть хорошо...
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823093
qasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pavel_nv, иногда, если нужна ещё большая скорость, можно попробовать JDBC Batch-и (чуть-чуть подправил ваш пример):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
String sqlQuery = "insert into event_entity (x,y,z) values (?,?,?)";
PreparedStatement statement = connection.prepareStatement(sqlQuery);
for (int i = 0; i < nEvents; i++) {
    statement.setInt(1,x[i]);
    statement.setLong(2,y[i]);
    statement.setString(3,z[i]);
    statement.addBatch();
}
statement.executeBatch()



Производительность при этом надо обязательно проверять.

P.S. Для особых случаев (мы это делали на загрузке котировок) ещё можно подбирать размеры batch-ей и частоту commit-ов. Но это драйвер должен поддерживать. Оракловый, например, поддерживает .
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823227
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинMolasarпропущено...

а если нет возможности формировать пакет записей?
Т.е. запись в таблицу должна производиться по мере поступления.

а откуда 1000 записей берется?

Архитектура приложения:
Отдельный сервер CentOS7 + MariaDB10.3 + ActiveMQ5 Stand-alone + Tomcat8.5
На на Tomcat запущен Async Listener, который при появлении нового сообщения в ActiveMQ5 Stand-alone тут же сохраняет его в MariaDB.
Сообщения в очереди могут появляться со скоростью 1000 в секунду, а могут и 1 сообщение в секунду. Ждать промежутки времени, формируя пакеты для записи в базу, это крайний плохой вариант.

Приведенный мной код - это настольное приложение на клиенте в одной сети с сервером для чистоты эксперимента.
В обоих случаях запись в очередь происходит мгновенно, а последующая запись в БД 30 записей в секунду. И это запись в таблицу с одним полем!!!!!
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823238
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarПриведенный мной код - это настольное приложение на клиенте в одной сети с сервером для чистоты эксперимента.
В обоих случаях запись в очередь происходит мгновенно, а последующая запись в БД 30 записей в секунду. И это запись в таблицу с одним полем!!!!!
Если в форуме есть хоть один специалист по БД. То он скажет что что-то здесь не то.

Ты нас обманываешь. Не может в современной БД скорость DML операций быть 30 записей в секунду.
Это могло быть в середине 20-го века во времена ленточных накопителей и ХДД размером с барабан.

Поэтому давай приводи DDL таблицы и проект и генератор записей. Мы будем проверять
и покажем тебе что на самом деле ты в чём-то ошибся.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823241
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GarrickMolasarВсем привет!

MariaDB 10.3
Есть таблица event_entity, в которой 1 поле id (счетчик).


Счётчики обычно по-другому делаются.
Ну что вы привязываетесь к деталям?
Я создавал не счетчик, а облегченный вариант - таблица с одним полем, чтобы добиться максимальной производительности.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823249
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
+1
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823261
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,

тебе надо использовать PreparedStatement с rewriteBatchedStatements=true
Если верить результатам их же бенчмарка: https://mariadb.com/resources/blog/mariadb-java-connector-driver-performance/
то этот параметр для батчей в 1000 записей дает лучшие результаты и на втором месте при единичных вставках.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823262
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинMolasar,

тебе надо использовать PreparedStatement с rewriteBatchedStatements=true
Если верить результатам их же бенчмарка: https://mariadb.com/resources/blog/mariadb-java-connector-driver-performance/
то этот параметр для батчей в 1000 записей дает лучшие результаты и на втором месте при единичных вставках.

а для чистоты эксперимента - проверить без всяких jdbc вставку 1000 записей на самом сервере. Интересно же.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823284
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qastapavel_nv, иногда, если нужна ещё большая скорость, можно попробовать JDBC Batch-и (чуть-чуть подправил ваш пример):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
String sqlQuery = "insert into event_entity (x,y,z) values (?,?,?)";
PreparedStatement statement = connection.prepareStatement(sqlQuery);
for (int i = 0; i < nEvents; i++) {
    statement.setInt(1,x[i]);
    statement.setLong(2,y[i]);
    statement.setString(3,z[i]);
    statement.addBatch();
}
statement.executeBatch()



Производительность при этом надо обязательно проверять.

P.S. Для особых случаев (мы это делали на загрузке котировок) ещё можно подбирать размеры batch-ей и частоту commit-ов. Но это драйвер должен поддерживать. Оракловый, например, поддерживает .
- да это должно помочь, но на проде надо писать код сложнее. Всегда возможен такой nEvents при котором приложение упадет. Если погуглить, то найдутся примеры с "постраничным" батчем (размер батча ограничивается).
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823287
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar+ Tomcat8.5
На на Tomcat запущен Async Listener, который при появлении нового сообщения в ActiveMQ5 Stand-alone тут же сохраняет его в MariaDB.

А без Tomcat, сразу в ActiveMQ нельзя реализовать обработку входящего сообщения?
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823288
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинОзверинMolasar,

тебе надо использовать PreparedStatement с rewriteBatchedStatements=true
Если верить результатам их же бенчмарка: https://mariadb.com/resources/blog/mariadb-java-connector-driver-performance/
то этот параметр для батчей в 1000 записей дает лучшие результаты и на втором месте при единичных вставках.

а для чистоты эксперимента - проверить без всяких jdbc вставку 1000 записей на самом сервере. Интересно же.
Создаю таблицу с одним полем:
Код: plsql
1.
CREATE TABLE t1 (c1 INT);


Запускаю процедуру:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
DELIMITER // 
CREATE PROCEDURE t1insert2 () begin
DECLARE i INT DEFAULT 1; 
WHILE i<1001 DO
INSERT INTO scjms_db.t1 (c1) Values (i);
SET i=i+1; 
END WHILE;
end //
CALL myinsert();


Результат выполнения - 30 sec
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823294
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar, тогда - это на другой форум уже, т.к. jdbc тут уже не причем.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823320
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,
Сколько раз говорить.
Есть раздел фррума где обсуждают скорость вставки порядкс 40000 на ядро.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823325
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
// Which engine ?
 create table scjms_db.t1 … 


DELIMITER // 
CREATE PROCEDURE t1insert2 () begin
DECLARE i INT DEFAULT 1; 
 START TRANSACTION;
WHILE i<1001 DO
 INSERT INTO scjms_db.t1 (c1) Values (i);
SET i=i+1; 
END WHILE;
 COMMIT;
end //
CALL myinsert();


Результат выполнения - 30 sec

Мой вопрос повис в воздухе. Какой engine был использован? Как часто идёт коммит? Может для этой марии
коммит это опупенно дорогая блджад операция и 30 с== 30 000 мс и скорость 30 000 / 1000 = 30 милисекунд на коммит?
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823326
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonMolasar
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
// Which engine ?
 create table scjms_db.t1 … 


DELIMITER // 
CREATE PROCEDURE t1insert2 () begin
DECLARE i INT DEFAULT 1; 
 START TRANSACTION;
WHILE i<1001 DO
 INSERT INTO scjms_db.t1 (c1) Values (i);
SET i=i+1; 
END WHILE;
 COMMIT;
end //
CALL myinsert();


Результат выполнения - 30 sec

Мой вопрос повис в воздухе. Какой engine был использован? Как часто идёт коммит? Может для этой марии
коммит это опупенно дорогая блджад операция и 30 с== 30 000 мс и скорость 30 000 / 1000 = 30 милисекунд на коммит?

есть подозрение, что на тематическом форуме ему помогут быстрее, чем тут.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823332
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonMolasar
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
// Which engine ?
 create table scjms_db.t1 … 


DELIMITER // 
CREATE PROCEDURE t1insert2 () begin
DECLARE i INT DEFAULT 1; 
 START TRANSACTION;
WHILE i<1001 DO
 INSERT INTO scjms_db.t1 (c1) Values (i);
SET i=i+1; 
END WHILE;
 COMMIT;
end //
CALL myinsert();


Результат выполнения - 30 sec

Мой вопрос повис в воздухе. Какой engine был использован? Как часто идёт коммит? Может для этой марии
коммит это опупенно дорогая блджад операция и 30 с== 30 000 мс и скорость 30 000 / 1000 = 30 милисекунд на коммит?
Не знаю, все настройки по умолчанию. Что такое engine не знаю... AutoCommit enable через MySql WorkBench
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823335
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть подозрение что автор сидит в "зоне комфорта".
Он не хочет разбираться в БД.
Он хочет и дальше дро..ить Java код.
Но это уже вопросы управленческой психологии.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823379
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 сильно НЕ мало.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823394
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, это очень мало. Тем более, что с большой долей вероятности никаких 1000 транзакций на выходе не будет - по умолчанию многие базы на выходе сами используют нечто вроде preparedstatements и там уже пакетно обрабатывают даже построчные операции.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823396
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинLeonid Kudryavtsev, это очень мало. Тем более, что с большой долей вероятности никаких 1000 транзакций на выходе не будет - по умолчанию многие базы на выходе сами используют нечто вроде preparedstatements и там уже пакетно обрабатывают даже построчные операции.

собственно по этой причине надо идти на тематический форум, т.к. тут такая масса "специалистов" по бд, что ими вадя заведует - насоветуют...
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823402
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локально на моей машине MariaDB по умолчанию пишет 1000 строк за 0.468 сек.
Видно проблема где-то в настройках сервера. Будем смотреть.
Это уже 3-я тема "Администрирование")))
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823428
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наконец-то.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823476
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,
))
Есть метод поиска, инженерный.
Не в конфигах искать а делим всю задачу пополам.
Потом еще пополам. Потом ещё.
Тогда на 1ой странице нашли бы неисправность.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823521
qasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kachalov- да это должно помочь, но на проде надо писать код сложнее. Всегда возможен такой nEvents при котором приложение упадет. Если погуглить, то найдутся примеры с "постраничным" батчем (размер батча ограничивается).
падение java-процесса: во-первых, должно быть достаточно редким случаем, во-вторых для таких случаев есть специальные термины (DLQ, CLIENT_ACKNOWLEDGE и т.п.) с помощью которых настраивается повторная доставка сообщения
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823546
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qastaпадение java-процесса: во-первых, должно быть достаточно редким случаем, во-вторых для таких случаев есть специальные термины (DLQ, CLIENT_ACKNOWLEDGE и т.п.) с помощью которых настраивается повторная доставка сообщения
- я имел в виду OutOfMemoryError в JVM при безлимитном батче (обычно хип у JVM меньше чем max_allowed_packet в MySQL/MariaDB). В любом случае, копить слишком большой батч не стоит - это и расход системных ресурсов, и вероятность потери данных, и снижение доступности БД в момент вставки. В идеале размер батча должен увязываться с настройками БД.
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823548
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalovобычно хип у JVM меньше чем max_allowed_packet в MySQL/MariaDB
- тут фигню написал, бывает по разному, зависит от настроек БД/JVM
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823567
qasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kachalov- я имел в виду OutOfMemoryError в JVM при безлимитном батче (обычно хип у JVM меньше чем max_allowed_packet в MySQL/MariaDB). В любом случае, копить слишком большой батч не стоит - это и расход системных ресурсов, и вероятность потери данных, и снижение доступности БД в момент вставки. В идеале размер батча должен увязываться с настройками БД.
конечно, не стоит. Это и на производительности сказывается, кстати (в случае с Ораклом).
Мы в программе делали сброс накопленного либо через каждые 250 строк или каждые 3 секунды - что раньше наступит (пишу по памяти - это было очень давно).
...
Рейтинг: 0 / 0
Как ускорить запись в таблицу через JDBC?
    #39823579
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинLeonid Kudryavtsev, это очень мало. Тем более, что с большой долей вероятности никаких 1000 транзакций на выходе не будет - по умолчанию многие базы на выходе сами используют нечто вроде preparedstatements и там уже пакетно обрабатывают даже построчные операции.

ПО ОПРЕДЕЛЕНИЮ - Транзакция неделимая операция которая должна быть ГАРАНТИРОВАНО сохранена. Т.ч.. по определению, транзакция завершается только тогда, когда она ФИЗИЧЕСКИ записана на диск (как минимум log файлы /для востановления/, грязные буфферы/дата_блоки вполне могут оставаться в памяти и выкидываться на диск асинхронно).

Некая буфферизация теоретически может быть, если на сервере паралелльно работает 100500 клиентов и за счет ЗАМЕДЛЕНИЯ времени отклика (latch). может увеличиваться пропускная способность (throughtinput). Но если вставки идут в одном потоке (не паралельно), то по определению, никакая база никакой буфферизации делать не должна и НЕ имеет такого права.
(во многих базу синхронизацию с диском /flush/ можно отпилить автогеном /Oracle, PostgreSQL/ тогда будет быстрее, но делают это только истинные самураи-камикадзе которым на целостность данных пофиг)

AFAIK
...
Рейтинг: 0 / 0
53 сообщений из 53, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Как ускорить запись в таблицу через JDBC?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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