|
|
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
tanglirGeronemo, то есть имелась в виду чистка уже той таблицы, куда записи пришли? Да, речь про 2-ю таблицу (OperationTable) Сначала в нее перемещаются данные из временной таблицы (раз в несколько секунд). Затем отдельный поток перекидывает эти данные обработчикам, которые отрабатывают с внешними серверами и возвращают какой-то результат, который мы пишем в эту таблицу. На этом, можно сказать, наша работа закончена. Клиент сделал запрос, мы его распарсили, отправили куда надо и сохранили результат. Но со временем в этой таблице накопится сотни миллионов записей и, учитывая, что в нее постоянно кто-то обращается, будут большие тормоза. Вот почему я задумался о том, что надо заиметь еще одну - архивную таблицу, куда бы перемещались неактуальные данные из OperationTable. Приведу пример. Вы заходит в интернет-банк и совершаете там платеж за услуги оператора связи. Какое-то время ваша операция будет храниться в списке активных операций. Пока до нее дойдет очередь, пока будет налажено соединение с оператором связи, передача данных, ответ оттуда. И когда мы получаем ответ, то эта наша операция уже не так важна, мы можем ее переместить в архив, а клиент, если вдруг будет не доволен качеством услуги (деньги заплатил, а на счет они не пришли), то может пожаловаться, сообщив id операции (ее он получает при первом обращении к серверу) и администраторы могут заглянуть в архив и посмотреть, что не так. Вот я и думаю, как лучше такое реализовать. На словах все очень просто. Но много вопросов - как часто перемещать данные исполненных запросов в Архив. Какой архив иметь - за все время (допустим, система будет все еще работать через 10 лет и придут ребята из органов, попросят данные 10-летней давности) или же иметь какой-нибудь срок давности, например год, а все остальное на удаление (или запись на Blu-ray и диск в ящик). Также интересно, в какое время перекидывать данные из OperationTable в Архив. У меня мысль такая. Допустим сейчас 5 утра 13.08. Ночью активность явно поменьше, чем днем. В это время можно устроить перенос данных с датой < 13.08.2014, 00:00:00. Также можно создать 4-ю таблицу, в которую в 5 утра будут перемещаться данные из OperationTable, по которым от соответствующего внешнего сервера пришел ответ "error" или ответ не пришел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 20:07:20 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Появился еще один вопрос. Касательно самой первой временной таблицы (напомню, что я пишу на java и работаю с БД) При обращении клиента к серверу и я делю insert в эту таблицу, там пишутся все данные (в том числе timestamp) и в результате на выходе получаю получаю id, но мне также надо еще и текущее время. Я могу сделать сразу же после insert'а select по id и получить время, но я тут озабочен быстродействием, есть ли способ получить время в одном запросе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 12:14:42 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Geronemo, к сожалению, returning в mysql нет, так что только вторым запросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 12:28:49 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Поясню вопрос. Сейчас я делаю 4 java операции 1. statement.executeUpdate(query, Statement.RETURN_GENERATED_KEYS); 2. statement.getGeneratedKeys(); Извлекаю id и сохраняю его 3. resultset = statement.executeQuery (select ... currenttime ... where id = 'id') 4. if (resultset.next()) currenttime = resultset .getTimestamp(1) Потом клиентку отправляю id и currenttime Хотелось бы, как-то объединить п. 1 и 3, а также 2 и 4. Как я написал выше, я довольно сильно озабочен быстродейстием. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 12:43:13 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
tanglirGeronemo, к сожалению, returning в mysql нет, так что только вторым запросом. Пока писал свое обобщение вопроса, вы мне ответили. Ок буду делать 2-й запрос. Жаль на форуме нельзя рейтинги ставить, я бы Вам плюсанул )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 12:44:47 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Geronemo, ну как вариант - если вы вставляете по одной записи - можно сделать хранимку, которая будет отдавать всё что угодно. Но "у ней унутре" опять же будет второй запрос, так что сэкономить тут удастся разве что на собственно посылке запроса по сети - а если жаба и скуль живут на одной машине, то эта экономия имхо будет совершенно призрачной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 13:06:08 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
tanglir, все верно, tanglirесли жаба и скуль живут на одной машине Сделал 2 последовательных запроса. Далее. Вопрос по множественному апдейту. Какой по-вашему из возможных вариантов более предпочтительнее 1. UPDATE `table` SET `field` = CASE `id` WHEN val1 THEN data1 WHEN val2 THEN data2 ELSE `field` END 2. там где on duplicate key ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 14:42:19 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
авторто эта экономия имхо будет совершенно призрачной. я б так не стал заявлять. время на переключение между программами, хоть и мало, но при тех требованиях, что у тс может играть роль. думаю, что передав часть логики в хранимку можно сэкономить приличное время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 15:45:18 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
вадя, не могли бы пояснить, я не совсем в курсе sql-жаргона, что такое хранимка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 15:52:41 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
хранимка - хранимая процедура http://yandex.ru/yandsearch?text=mysql хранимые процедуры&from=fx3&clid=1909644 вещь очень полезная. для твоей цели - (очень грубо говоря) резместить оба запроса в хранимку и на этом сэкономить время на переключении между приложениями. ну а правильно - переложить туда весь анализ и пр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 16:23:53 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
вызов хранимки без возврата результата Код: java 1. 2. 3. с возвращением результата Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 16:31:58 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
вадя, спасибо. Пока сделал в 2 запроса, чуть позже займусь оптимизацией. по поводу множественного апдейта, повторю вопрос, какой способ лучше (с т. з. быстродействия) 1. UPDATE `table` SET `field` = CASE `id` WHEN val1 THEN data1 WHEN val2 THEN data2 ELSE `field` END 2. INSERT INTO `table` (id, field) VALUES (1, 1), (2, 12), (3, 0.5) ON DUPLICATE KEY UPDATE field = VALUES(field) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 16:33:34 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
если у тебя мульоны данных в таблице (куда вставляешь) - первый быстрее, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 16:43:28 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. в данном варианте выяснение чир вставлять я бы вынес из запроса в java запрос стал таким Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 16:54:38 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
ЗЫ а если id не рано ни val1, ни val2, тогда и запрос вызывать не надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 16:57:29 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
вадя, спс за хранимку )) В моем случае 1. Вы правы, у меня мульон записей 2. данные с полученным id процентов на 99 присутсвуют ()кроме каких-то форс-мажоров) /quot] в данном варианте выяснение чир вставлять я бы вынес из запроса в java запрос стал таким Код: sql 1. [/quot] А вот тут есть вопрос. Я читал, что разного рода логика в MySQL Работает быстрее и потому всякие поиски по id, сортировки лучше переложить на БД, ( например, лучше сделать один большой запрос, чем много простых в цикле). Или может я вашу мысль неправильно понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 18:29:16 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. если мульон, то это странный запрос. в зависимости от id он поменяет во всём мульоне в поле field значение на data1 или data2 или на прежнее зачем менять на прежнее во всём мульоне? по факту ничено не изменится, только потратится время. либо приведенный запрос не верен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2014, 22:11:29 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
вадя Код: sql 1. 2. 3. 4. если мульон, то это странный запрос. в зависимости от id он поменяет во всём мульоне в поле field значение на data1 или data2 или на прежнее зачем менять на прежнее во всём мульоне? по факту ничено не изменится, только потратится время. либо приведенный запрос не верен. Т. е. строчка ELSE `field` присваивает каждой записи, полю field текущее значение ? А нету ли такого множественного апдейта, который затрагивал бы только те записи, которые мне нужны. Потому что у меня мульон записей и в секунду обрабатывается несколько сотен. Может сделать такой запрос String updateString = "UPDATE OperationTable SET field_name "success" WHERE ID = id1;" + .... UPDATE OperationTable SET field_name "success" WHERE ID = idi; + .... UPDATE OperationTable SET field_name "success" WHERE ID = idn;" statement.execute(updateString); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2014, 12:24:10 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
наверно будет грубовато, но инет богат мануалами, и даже на русском. http://yandex.ru/yandsearch?text=mysql update&from=fx3&clid=1909644 http://phpclub.ru/mysql/doc/update.html если хочешь научиться, скачай dbForge, там в удобном виде , с шаблонами, с gui, можно пробовать(только не на боевой базе, конечно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2014, 13:51:29 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
вадянаверно будет грубовато, но инет богат мануалами, и даже на русском. http://yandex.ru/yandsearch?text=mysql update&from=fx3&clid=1909644 http://phpclub.ru/mysql/doc/update.html если хочешь научиться, скачай dbForge, там в удобном виде , с шаблонами, с gui, можно пробовать(только не на боевой базе, конечно) Вовсе не грубовато. Я постоянно почитываю такого рода и много вещей делаю сам. А сюда задаю вопросы, если есть какие-то сомнения или, если я наткнулся на ошибку, которая отнимает много времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2014, 14:14:30 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Зупустил 2 раза приложение на продолжительное тестирование В первый раз работало где-то час, образовалось 150000 записей. Ни одна не потерялась, ни одной ошибки не вылетело. Во второй раз через полчаса, после где-то 70000 записей. Стало вываливаться исключение в строчке connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/PaymentServer?user=root&password=xxxxx"); вот такого вида om.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections" at sun.reflect.GeneratedConstructorAccessor39.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance Я нагрузил сервер по-максимуму и он упал. Похоже слишком много потоков и соответственно слишком много соединений. Как с этим бороться. Может не (открывать/закрывать) соединение с БД так часто (как это сделать). Или вообще установить соединение 1 раз и не рвать его, пока сервер не остановится (т. е. чтобы все желающие что-то куда-то писать пользовались одним connection) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2014, 17:49:18 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
я так общаюсь с базой Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. а ты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2014, 20:39:42 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
вадя, у меня похоже некоторые исключения не обрабатывались, сейчас я привел код к такому виду. Кстати, утром поставил симуляция, получилось 37000 записей, потом вылетело то самое исключение. Теперь я привел все методы работы с БД вот к такому виду и поставлю опять симуляцию на пару часиков Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2014, 16:43:05 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2014, 21:06:03 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
вадя ? это была ошибка копи-паста. fixed Запустил симуляцию на пару часов, около 50000 запросов, причем, начиная с 70000 стали вываливаться исключения и 430000 записей остались во временной таблице. У меня есть некоторые соображения, как это можно поправить, сейчас запущу симуляцию еще раз. Напомню, исключение вы валивается в строчке cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/PaymentServer?user=root&password=123"); имеет очень большой stack race. Вот его часть com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections" at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:408) at com.mysql.jdbc.Util.handleNewInstance(Util.java:408) at com.mysql.jdbc.Util.getInstance(Util.java:383) ....... Может можно как-то ограничить количество одновременных соединений с БД и приказать потокам вставать в очередь ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2014, 21:28:47 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38720531&tid=1832955]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
41ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 375ms |

| 0 / 0 |
