powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Подготовка строки для SQL вставки
25 сообщений из 34, страница 1 из 2
Подготовка строки для SQL вставки
    #38580439
denis111111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день
Нужно вставить в базу MySQL строку типа "1234\123\123'123232\n3434", как она есть, тобто экранировать \, \n, ' символы (все спец символы MySQL).
PrepareStatement мне не пойдет, так уж сложилось...
Может есть в JDBC есть готовая утилита для этого, или что-то другое?
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38580441
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis111111PrepareStatement мне не пойдет, так уж сложилось...
Really?
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38580444
denis111111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczReally?
ага
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38580451
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так небывает
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38580476
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczтак небывает

Ошибка!
Правильно "не бывает" :)

Но вообще вдруг у человека обязательно использование API, которое принимает "строку запроса".
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38580482
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin,

Та я видел. Осечка. Был бы тут апдейт своих сообщений, исправил бы сразу.

Любой даже чужой API можно перелопатить. Единственный сценарий, это если надо целиком SQL запрос с параметрами куда-то передавать удаленно через XML или другой недодуманный протокол и удаленно же исполнять.
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38580506
denis111111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок, припустим PreparedStatement можно использовать, но как мне вставить с его помощью много записей?
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38580513
denis111111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
4.
5.
6.
7.
  PreparedStatement st = conn.prepareStatement("INSERT INTO `test`.`parent` (`name`) VALUES (?)");
            for (Parent p : list) {
                st.setString(1, p.getName());
                st.addBatch();
            }
            st.executeBatch();
            st.close();


Это правильный подход?

делал еще так:
Код: java
1.
2.
3.
4.
Statement st = conn.createStatement();
String query = createQuery(list);
st.executeUpdate(query);
st.close();


Результат времени вставок 200 записей:
Batch, size of records 100: 2422
Handle, size of records 100: 31
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38580775
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis111111
Код: java
1.
2.
3.
4.
5.
6.
7.
  PreparedStatement st = conn.prepareStatement("INSERT INTO `test`.`parent` (`name`) VALUES (?)");
            for (Parent p : list) {
                st.setString(1, p.getName());
                st.addBatch();
            }
            st.executeBatch();
            st.close();


Это правильный подход?


Нет. Вот пример правильного .
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38580802
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomindenis111111
Код: java
1.
2.
3.
4.
5.
6.
7.
  PreparedStatement st = conn.prepareStatement("INSERT INTO `test`.`parent` (`name`) VALUES (?)");
            for (Parent p : list) {
                st.setString(1, p.getName());
                st.addBatch();
            }
            st.executeBatch();
            st.close();


Это правильный подход?


Нет. Вот пример правильного .

Блин. С утра не заметил. Что за БД, что тормозит на батче?
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38580804
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis111111
Код: java
1.
2.
3.
4.
5.
6.
7.
  PreparedStatement st = conn.prepareStatement("INSERT INTO `test`.`parent` (`name`) VALUES (?)");
            for (Parent p : list) {
                st.setString(1, p.getName());
                st.addBatch();
            }
            st.executeBatch();
            st.close();


Это правильный подход?


В общем- MySQL такая SQL, что везде надо напильник доставать.
По медленной вставке в гуле немало есть, например вот .
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38580882
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а кто мешает использовать такое?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
StringBuilder sb= new StringBuilder();
sb.append("INSERT INTO `test`.`parent` (`name`) VALUES ");
for (Parent p : list) {
                ab.append("('").append( p.getName()).append("'),");
            }
sb.delete(sb.length() - 1, sb.length());

PreparedStatement st = conn.prepareStatement(sb.toString());
st.executeQuery();
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38580909
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis111111,

Может поможет, не знаю работает ли.

http://www.java2s.com/Code/Java/Data-Type/UnescapeanyMySQLescapesequences.htm
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38580922
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FD,

В догонку, есть рекомендации
http://stackoverflow.com/questions/2993251/jdbc-batch-insert-performance
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38580938
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из последней ссылки

You can insert multiple rows with one insert statement, doing a few thousands at a time can greatly speed things up, that is, instead of
doing e.g. 3 inserts of the form INSERT INTO tbl_name (a,b,c) VALUES(1,2,3); , you do INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),
(1,2,3),(1,2,3); (It might be JDBC .addBatch() does similar optimization now - though the mysql addBatch used to be entierly un-optimized
and just issuing individual queries anyhow - I don't know if that's still the case with recent drivers)

If you really need speed, load your data from a comma separated file with LOAD DATA INFILE , we get around 7-8 times speedup doing that
vs doing tens of millions of inserts.
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38581005
denis111111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за советы
Я так понял что MySQL драйвер не делает multiple insert, я тестировал скорость и вот что вышло:

Handle, size of records 1000: 125 -- вставка происходит одним запросом типа INSERT INTO `parent` (`name`) VALUES (1), (1), (1)...
Batch, size of records 1000: 26985 -- вставка через батч
Simple, size of records 1000: 29218 -- вставка каждой записи оддельно

0FD
На жаль это Unescape any MySQL escape sequences. не подходит , например из 'В\яче\слав' зделает 'Вячеслав', а должно быть 'В\\яче\\слав'
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38581038
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis111111,

Ну а это пробовали?

I had a similar performance issue with mysql and solved it by setting the useServerPrepStmts and the rewriteBatchedStatements properties in the connection url.

пишут скорость увеличилась от 3 до 30 раз
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38581052
denis111111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0FD,
Вот результат если прописать ?useServerPrepStmts=false&rewriteBatchedStatements=true:
Handle, size of records 100: 47
Batch, size of records 100: 47
Simple, size of records 100: 2281
Это как раз то что нужно, спасибо)
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38581055
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно с MariaDB такая же лажа?
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38581086
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как ни крути, а
одним запросом типа INSERT INTO `parent` (`name`) VALUES (1), (1), (1)...
будет быстрее, потому как все разделено, т.е. формирование sql строки через StringBuilder самое быстрое из возможных и
выполнение полностью отдается серверу mysql.
а Batch это дополнительная прослойка, требующая время.

ну а чтоб экранировать можно воспользоваться регулярными выражениям.
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38581135
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis1111110FD,
Вот результат если прописать ?useServerPrepStmts=false&rewriteBatchedStatements=true:
Handle, size of records 100: 47
Batch, size of records 100: 47
Simple, size of records 100: 2281
Это как раз то что нужно, спасибо)

Не зря я не люблю мускл :)

Я б попробовал

insert into vvv (...) values (?),(?),(?)

А потом навставлять параметров. Если ничего не треснет- может получится интересно.
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38581158
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чем отличается
insert into vvv (...) values (?),(?),(?)
от
одним запросом типа INSERT INTO `parent` (`name`) VALUES (1), (1), (1)...

дополнительной прослойкой?
второй вариант я даже реализовал в хранимке и выполнял с помощью PREPARE
летает на ура.
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38581175
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяа чем отличается
insert into vvv (...) values (?),(?),(?)
от
одним запросом типа INSERT INTO `parent` (`name`) VALUES (1), (1), (1)...

Тем, что во тором варианте можно поиметь проблемы с sql-инъекциями, намеренными или нет
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38581183
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а впервом, кто мешает вместо вопроса инъекцию вставить?
...
Рейтинг: 0 / 0
Подготовка строки для SQL вставки
    #38581186
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяа чем отличается
insert into vvv (...) values (?),(?),(?)
от
одним запросом типа INSERT INTO `parent` (`name`) VALUES (1), (1), (1)...

дополнительной прослойкой?

Собственно второй вариант не подходит автору, т.к. у него в строке всякие чудеса.
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Подготовка строки для SQL вставки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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