Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / Как ускорить запись в таблицу через JDBC? / 25 сообщений из 53, страница 1 из 3
05.06.2019, 17:28
    #39822986
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить запись в таблицу через JDBC?
Всем привет!

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
05.06.2019, 17:32
    #39822987
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить запись в таблицу через JDBC?
Molasar,
читай доки на
insert into .... values ()
и столько надо вставлять из csv файла
...
Рейтинг: 0 / 0
05.06.2019, 17:33
    #39822990
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить запись в таблицу через JDBC?
...
Рейтинг: 0 / 0
05.06.2019, 17:43
    #39823000
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить запись в таблицу через JDBC?
ОзверинMolasar,

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

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

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

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

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


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

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

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


Счётчики обычно по-другому делаются.
...
Рейтинг: 0 / 0
05.06.2019, 18:14
    #39823035
Garrick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить запись в таблицу через JDBC?
вадяGarrickНикакой Pool на скорость INSERT не влияет, Pool он для другого.на саму скорость не влияет, но не известно что у ТС в реальности, а не на приведённом примере. если есть ожидание - то возможно он для каждого инсерта создаёт подключение...
Тогда да, на скорость повторного подключения влияет.
...
Рейтинг: 0 / 0
05.06.2019, 18:21
    #39823039
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить запись в таблицу через JDBC?
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
05.06.2019, 19:01
    #39823060
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить запись в таблицу через JDBC?
MolasarОзверинMolasar,

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

а откуда 1000 записей берется?
...
Рейтинг: 0 / 0
05.06.2019, 19:03
    #39823061
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить запись в таблицу через JDBC?
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
05.06.2019, 19:13
    #39823065
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить запись в таблицу через JDBC?
MolasarДобавление 1000 записей отбирает целых 35 сек драгоценного времени(((((
Твой бенчмарк не показывает ровным счетом ничего. Какой-то кусок кода работает на твоей тачке 35 секунд, и что?
Если хочешь чтобы тебе помогли - расскажи какая перед тобой конкретно стоит задача и что конкретно не получается. По уровню твоих вопросов видно, что задача эта не твоего уровня и скорее всего ты ее интерпретировал неправильно, а возможно и просто придумал. Для начала можешь почитать Шипилева о том как надо правильно писать бенчмарки.
MolasarКак ускорить запись в таблицу?

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

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

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

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

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

согласен, с такой скорости 10 индусов бы руками быстрее вставили
...
Рейтинг: 0 / 0
05.06.2019, 19:17
    #39823072
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить запись в таблицу через JDBC?
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
05.06.2019, 19:25
    #39823074
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить запись в таблицу через JDBC?
Leonid Kudryavtsev3) и самый главный ПРИ ЧЕМ, Б#$%, ТУТ JAVA ?ну, как минимум, вставка идет в цикле на java. для большей точности надо определить время не по всему циклу, а время каждой вставки, взять минимальное и максимальное, и не только для 1000, а 5000, 10000
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как ускорить запись в таблицу через JDBC? / 25 сообщений из 53, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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