|
|
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
Добрый день Нужно вставить в базу MySQL строку типа "1234\123\123'123232\n3434", как она есть, тобто экранировать \, \n, ' символы (все спец символы MySQL). PrepareStatement мне не пойдет, так уж сложилось... Может есть в JDBC есть готовая утилита для этого, или что-то другое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2014, 17:19 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
denis111111PrepareStatement мне не пойдет, так уж сложилось... Really? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2014, 17:20 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
BlazkowiczReally? ага ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2014, 17:22 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
так небывает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2014, 17:29 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
Blazkowiczтак небывает Ошибка! Правильно "не бывает" :) Но вообще вдруг у человека обязательно использование API, которое принимает "строку запроса". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2014, 17:59 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, Та я видел. Осечка. Был бы тут апдейт своих сообщений, исправил бы сразу. Любой даже чужой API можно перелопатить. Единственный сценарий, это если надо целиком SQL запрос с параметрами куда-то передавать удаленно через XML или другой недодуманный протокол и удаленно же исполнять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2014, 18:10 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
Ок, припустим PreparedStatement можно использовать, но как мне вставить с его помощью много записей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2014, 18:33 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. Это правильный подход? делал еще так: Код: java 1. 2. 3. 4. Результат времени вставок 200 записей: Batch, size of records 100: 2422 Handle, size of records 100: 31 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2014, 18:47 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
denis111111 Код: java 1. 2. 3. 4. 5. 6. 7. Это правильный подход? Нет. Вот пример правильного . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 08:46 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
Alexey Tomindenis111111 Код: java 1. 2. 3. 4. 5. 6. 7. Это правильный подход? Нет. Вот пример правильного . Блин. С утра не заметил. Что за БД, что тормозит на батче? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 09:28 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
denis111111 Код: java 1. 2. 3. 4. 5. 6. 7. Это правильный подход? В общем- MySQL такая SQL, что везде надо напильник доставать. По медленной вставке в гуле немало есть, например вот . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 09:30 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
а кто мешает использовать такое? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 10:48 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
denis111111, Может поможет, не знаю работает ли. http://www.java2s.com/Code/Java/Data-Type/UnescapeanyMySQLescapesequences.htm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 11:12 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
0FD, В догонку, есть рекомендации http://stackoverflow.com/questions/2993251/jdbc-batch-insert-performance ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 11:17 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
из последней ссылки 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 11:25 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
Спасибо за советы Я так понял что 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. не подходит , например из 'В\яче\слав' зделает 'Вячеслав', а должно быть 'В\\яче\\слав' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 12:15 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
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 раз ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 12:40 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
0FD, Вот результат если прописать ?useServerPrepStmts=false&rewriteBatchedStatements=true: Handle, size of records 100: 47 Batch, size of records 100: 47 Simple, size of records 100: 2281 Это как раз то что нужно, спасибо) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 12:48 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
Интересно с MariaDB такая же лажа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 12:49 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
как ни крути, а одним запросом типа INSERT INTO `parent` (`name`) VALUES (1), (1), (1)... будет быстрее, потому как все разделено, т.е. формирование sql строки через StringBuilder самое быстрое из возможных и выполнение полностью отдается серверу mysql. а Batch это дополнительная прослойка, требующая время. ну а чтоб экранировать можно воспользоваться регулярными выражениям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 13:14 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
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 (?),(?),(?) А потом навставлять параметров. Если ничего не треснет- может получится интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 14:09 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
а чем отличается insert into vvv (...) values (?),(?),(?) от одним запросом типа INSERT INTO `parent` (`name`) VALUES (1), (1), (1)... дополнительной прослойкой? второй вариант я даже реализовал в хранимке и выполнял с помощью PREPARE летает на ура. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 14:23 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
вадяа чем отличается insert into vvv (...) values (?),(?),(?) от одним запросом типа INSERT INTO `parent` (`name`) VALUES (1), (1), (1)... Тем, что во тором варианте можно поиметь проблемы с sql-инъекциями, намеренными или нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 14:41 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
а впервом, кто мешает вместо вопроса инъекцию вставить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 14:45 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
вадяа чем отличается insert into vvv (...) values (?),(?),(?) от одним запросом типа INSERT INTO `parent` (`name`) VALUES (1), (1), (1)... дополнительной прослойкой? Собственно второй вариант не подходит автору, т.к. у него в строке всякие чудеса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 14:45 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
Alexey Tominвадяа чем отличается insert into vvv (...) values (?),(?),(?) от одним запросом типа INSERT INTO `parent` (`name`) VALUES (1), (1), (1)... дополнительной прослойкой? Собственно второй вариант не подходит автору, т.к. у него в строке всякие чудеса. я уже подсказал авторну а чтоб экранировать можно воспользоваться регулярными выражениям. с точки зрения безопасности оба метода раскрывают структуру таблицы, в случае декомпиляции кода, это важно если данный код не серверный. поэтому лучше использовать хранимки, и там проверять на возможные инъекции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 14:57 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
вадяа впервом, кто мешает вместо вопроса инъекцию вставить? А как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 15:55 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
вадяBatch это дополнительная прослойка, требующая время. В нормальных БД это не прослойка, а фича сервера. В мускуле и прослойка? Тогда это ещё один повод забыть о нём. вадяну а чтоб экранировать можно воспользоваться регулярными выражениям. И постоянно трястись, что что-то не учёл. Сколько серверов взломано из-за неучтённого изврата хакера- не счесть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 15:57 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
Alexey Tominвадяа впервом, кто мешает вместо вопроса инъекцию вставить? А как? так же как и во втором случае в обоих случаях данные вставляются из одго источника(тут за небольшим исключением, что в первом случае выполняется по одному значению (для ускорения можно привести и к вставке нескольких)) Код: java 1. 2. 3. 4. Код: java 1. 2. 3. в итоге сервер mysql выполнит один и тот же код авторВ нормальных БД это не прослойка, а фича сервера. В мускуле и прослойка? Тогда это ещё один повод забыть о нём. это прослойка не у БД, прослойка позволяющая преообразовать обращение к БД другим методом, для кого-то более наглядным такая запись insert into vvv (...) values (?),(?),(?) и т.д. более читабельна, чем 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()); я ни где не слышал что batch проверяет на инъекции. а если есть такая проверка - то это еще один дополнительный тормоз. боишься инъекций - проверяй вносимые данные на соответствие твоим хранимым данным(с большей долей вероятности можно сказать что у большинства данных нет ключевых слов базыданных) авторИ постоянно трястись, что что-то не учёл. Сколько серверов взломано из-за неучтённого изврата хакера- не счесть. это в любом случае не избежать, если буде поставлена такая цель как пример правильная проверка мыла 15595681 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 17:46 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
Попробовал на оракле (10g XE) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Может быть вариант с текстом можно было сделать лучше, но все равно останутся проблемы: 1. Нужно собрать строку больших размеров. (а чтобы это сделать нужно позволить JVM съесть много памяти) 2. Sql инъекции & экранирование символов. 3. Приседания c локалями (разделителями целой и дробной части). Чтобы внезапно не получить заместо пяти тысяч (5001,35) пол миллиона (500135). 4. Вставка дат\бинарных данных (первое представляю как сделать, второе даже представлять не хочу..) Код Код: 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. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. Класс Db (если нужен) тут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 20:29 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
вадяAlexey Tominпропущено... А как? так же как и во втором случаев обоих случаях данные вставляются из одго источника(тут за небольшим исключением, что в первом случае выполняется по одному значению (для ускорения можно привести и к вставке нескольких)) пропущено... в итоге сервер mysql выполнит один и тот же код Понял. Т.е. MySQL, в отличии от Oracle, firebird, postgresql и т.д. и т.п. не умеет делать ни batch-update, ни predaredStatement и драйвер это тупо эмулирует. Т.е. MySQL использовать нельзя никогда и нигде. А автору- да, нужно извращаться с регулярными выражениями и верить, что его не сломают. вадяя ни где не слышал что batch проверяет на инъекции. а если есть такая проверка - то это еще один дополнительный тормоз. боишься инъекций - проверяй вносимые данные на соответствие твоим хранимым данным(с большей долей вероятности можно сказать что у большинства данных нет ключевых слов базыданных) В нормальных серверах проверка не нужна. Т.к. подстановка параметров в запрос идёт после того, как сервер распарсил текст, превратил его в дерево, построил план запроса. Т.е. в текст можно вставить хоть что- проблем не будет НИКАКИХ. При этом даже без batch-update prepared будет быстрее, т.к. парсер найдёт запрос в кэше и просто возьмёт готовое дерево. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2014, 21:54 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
2avp.mk я б не стал таким образом вставлять более 100 строк для этого существует вставка из файла LOAD DATA авторт.е. MySQL использовать нельзя никогда и нигде. категоричность не есть правильность.... у mysql есть своя ниша и довольно большая насчет predaredStatement в mysql - http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html оно есть :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2014, 00:36 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
http://dev.mysql.com/doc/refman/5.6/en/c-api-prepared-statement-function-overview.html может я ошибся.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2014, 00:42 |
|
||
|
Подготовка строки для SQL вставки
|
|||
|---|---|---|---|
|
#18+
и вот ещё http://habrahabr.ru/post/149613/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2014, 00:49 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2127543]: |
0ms |
get settings: |
5ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
146ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 239ms |
| total: | 490ms |

| 0 / 0 |
