powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
69 сообщений из 69, показаны все 3 страниц
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718085
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.

Я давно не имел дела с SQL. Пишу простенькую клиент-серверную программу на Java с хранением данных в MySQL.

Есть java-сервлет, который получает от множества клиентских приложений данные (допустим это 10 штук в секунду от 1000 клиентов, т. е. в среднем каждый клиент посылает данные 1 раз за 100 сек.). Этот сервлет сохраняет эти данные в БД в некую таблицу TempTable.

Также есть на сервере есть программа, которая раз в несколько секунд (например раз в 1 секунду).
1. Читает ВСЕ записи в таблице TempTable
2. Сохраняет их в таблицу операций OperationTable, а также сохраняет в памяти
3. Удаляет все записи из таблицы TempTable
4. дальнеяшая обработка данных из памяти.

Вопрос тут и по Java и по особенностям MySQL.
Как мне защитить систему от потери данных. Например п. 3 удаляет все записи из временной таблицы, но пока работал п.2 мы получили запрос от клиента и добавили запись в соответствии с п. 1. и получается, что эту новую запись мы удалили и она так и не появилась в п. 2 и 4.

Я так понимаю, что пока работают п. 1-3 надо заблокировать таблицу TempTable от других операций и если приходит новый запрос от клиента, он должен встать в очередь (а не сделать запись и не вывалить исключение). Вопрос в том, как это реализовать. Средствами MySQL или на Java есть инструменты, получающие эксклюзивный доступ к таблице на время выполнения нескольких операций.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718098
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,

а вы пишите во врем.таблицу время появления каждой записи (добавьте в таблицу поле timestamp defaul current_timestamp)
и обрабатывайте каждый раз, допустим, не все записи, а только те, что старше (текущее время - интервал запуска батча)
думаю, отставание в 1 секунду будет некритично, а другие варианты будут куда замороченнее
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718110
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мдя...он походу никогда не имел дело с sql :) - исходя из постановки вопроса, только начал.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718162
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453мдя...он походу никогда не имел дело с sql :) - исходя из постановки вопроса, только начал.

Имел дело несколько лет назад, но даже тогда это не было моей прямой обязанностью.

Просьба писать по существу.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718279
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Придумал еще одно решение проблемы. У меня в таблице TempTable есть id auto_increment
И это поле я также читаю и сохраняю для последующей обработки.
В принципе, в п. 3. удаление записей я могу сделать по списку этих id

Но может можно сделать проще средствами java
(Вопрос к знатокам java)
допустим такой код

(1) Statement statement = сonnection.createStatement()
....
Чтение всех данных из TempTable
....
Запись данных в OperationTable
....
Удаление всех записей из TempTable

(N) statement.close()

Можно ли на участке кода от строчки кода номер 1 до N зпретить кому бы то ни было извне обращаться к таблице TempTable
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718417
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на чтение - нет
посмотри в сторону хранимых процедур- возможно в них логику перенести и будет тебе счастье.
а решение 16430816 лучший вариант.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718702
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,

16430816 -- стандартное хорошее решение.
(Есть варианты, например с дополнительной колонкой статуса)

Алаверды : предложеное решение отличается от
того что вы спрашиваете по нескольким позициям:

1. вместо работы со всей таблицей у вас есть гибакая
возможность обрабатывать очередь по частям,
возможно даже в несколько потоков.

2. Блокировка переносится с "физической" базы
в логику аппликации -- больше контроля и гибкости.

3. Логическая блокировка (по ид, таймстампу, по колонке статуса)
может длится как угодно долго. Долгие физические блокировки
крайне не рекомендуются.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718801
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант с timestamp мне не очень понравился.

Я добавил поле curenttime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
Увеличил интервал обращения сервера к таблице TempTable до 10 сек.
Запустил эмулятор клиентских приложений и сервер на несколько секунд, чтобы сервер записал обращения клиентов, но ни разу не обработал эти данные (п. 1-3 из 1-го сообщения).

Затем я вручную пошел и посмотрел содержимое таблицы TempTable и увидел кучу сообщений со значением '2014-08-12 21:05:50' в поле curenttime, также куча записей со значением '2014-08-12 21:05:51' ,'2014-08-12 21:05:52' и т. д.

Такой вариант меня не устраивает. Если бы писали миллисекунды, то можно бы было разграничить данные.
А так может получиться, что сервер извлекает все данные вплоть по '2014-08-12 21:05:54', например, и пока он сих обрабатывает клиентские приложения сделают еще несколько запросов и они будут датированы этим же значением '2014-08-12 21:05:54'. И мы удалим в том числе и их.

Может есть какая-нибудь функция, дающая более точное время, с миллисекундами.

Или же я что-то не так понимаю.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718804
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,

Поставьте верхний предел обработки
как текушее время МИНУС одна (или 3, если нервы дроже) секунда.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718864
Stupid_BOT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,
две временные таблицы.

> Также есть на сервере есть программа, которая раз в несколько секунд (например раз в 1 секунду).
1. Сообщает сервлету, что начинает чтение из таблицы [1] (сервлет начинает писать в таблицу [2]). Читает ВСЕ записи в таблице [1]
2. Сохраняет их в таблицу операций OperationTable, а также сохраняет в памяти
3. Удаляет все записи из таблицы [1]
4. дальнеяшая обработка данных из памяти.

5. Сообщает сервлету, что начинает чтение из таблицы [2] (сервлет начинает писать в таблицу [1]) ...
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718872
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Все заработало.
Надо еще какое-то время погонять, чтобы убедиться, что данные не пропадают, но в целом думаю, что все норм.

Есть еще один вопрос, не буду создавать новую тему. Что вы думаете по поводу Java Hibernate, стоит ли заморачиваться с ним, когда у меня БД очень простая. Или же лучше всегда использовать Hibernate, просто потому что так правильнее.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718875
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stupid_BOT, временная таблица у меня одна.
Та, 2-я это итоговая таблица, куда скидываются все данные от клиентов, а также потом происходит некоторая их обработка (а конкретно модификация одного поля - Статус, который мжет иметь несколько значений, типа 'В процессе', 'успешно', 'ошибка'....)

Возвращать результат обработки клиенту задачей не предусмотрено.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718884
Stupid_BOT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,
я так понял, что и сервлет, и "серверная" программа - оба могут быть Вами модифицированы. И предложил вариант с переключением временных таблиц.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718889
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeronemoСпасибо. Все заработало.
Надо еще какое-то время погонять, чтобы убедиться, что данные не пропадают, но в целом думаю, что все норм.

Есть еще один вопрос, не буду создавать новую тему. Что вы думаете по поводу Java Hibernate, стоит ли заморачиваться с ним, когда у меня БД очень простая. Или же лучше всегда использовать Hibernate, просто потому что так правильнее.


Нету такого понятия как "правильнее".
Все "зависит от".

Для расширения кругозора кибернат ооочень полезен,
как и знать что такое обжект-релейшнл мапинг (ORM).

Конкретно к вашему проекту -- 2 таблицы и 3 класса --
нафик не надо, но если есть время -- сделайте в отдельном бранче,
что бы знать на будушее.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718890
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0. начать транзакцию.
1. Читать по одной записи в таблице TempTable. читать с for update.
2. Сохранять их в таблицу операций OperationTable, а также сохраняет в памяти
3. Удалять только что обработанную запись из таблицы TempTable
4. делать это все в цикле, пока есть записи.
5. при окончании набора входных записей завершить транзакцию.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38718892
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,

вообще, тут напрашивается для использования jms, и никаких прямых работ с бд.

правда, транзакции и там нужны будут.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38719025
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeronemoЕсли бы писали миллисекунды, то можно бы было разграничить данные.
А так может получиться, что сервер извлекает все данные вплоть по '2014-08-12 21:05:54', например, и пока он сих обрабатывает клиентские приложения сделают еще несколько запросов и они будут датированы этим же значением '2014-08-12 21:05:54'. И мы удалим в том числе и их.

Может есть какая-нибудь функция, дающая более точное время, с миллисекундами.Почему вы считаете, что миллисекунды совпасть не могут? :)
javajdbcGeronemo,

Поставьте верхний предел обработки
как текушее время МИНУС одна (или 3, если нервы дроже) секунда.Я об этом уже писал, кстати. В том самом посте.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38719163
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv0. начать транзакцию.
1. Читать по одной записи в таблице TempTable. читать с for update.
2. Сохранять их в таблицу операций OperationTable, а также сохраняет в памяти
3. Удалять только что обработанную запись из таблицы TempTable
4. делать это все в цикле, пока есть записи.
5. при окончании набора входных записей завершить транзакцию.

Спасибо за предложенный вариант, но тут есть нюансы, а которых я не указал первоначально.

Возникает вопрос о быстродействии, если повысить частоту получения данных от клиентов.
+ у меня п. 1. организован таким образом, что в цикле происходит select * TempTable where operation_type = "несколько видов операций". Мне разделение по типам операций нужно, чтобы создать несколько массивов однотипных данных и отправлять обработчикам их массивами, а не по по одному.

В вашем варианте, как мне кажется можно было бы обойтись вообще без TempTable, просто писать сразу в таблицу OperationTable и добавить в поле статуса вариант значения "данные только что получены от клиента" и потом апдейтить его.

Весь смысл существования временной таблицы в том, что на входе у нас запросы от тысяч клиентов, а на выходе мы должны отослать данные небольшому количеству внешних серверов неким пакетом и получить ответ. Для этого я накапливаю большое количество записей во временной таблице, а потом раз в несколько секунд извлекаю их оттуда, группирую по типу операций и делаю всего штук 5-10 запросов на внешние серверы. Я так понимаю, что процесс извлечения данных из БД происходит значительно быстрее, чем установка соединения с внешним сервером (которых было бы тысячи).
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38719167
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,
спасибо за совет. Никто у вас не отнимает лавры, просто я ваше предложение, похоже, не совсем внимательно изучил.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38719172
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivGeronemo,

вообще, тут напрашивается для использования jms, и никаких прямых работ с бд.

правда, транзакции и там нужны будут.

тут у меня дело в том, что клиенты и внешние серверы это программы, написанные сторонними людьми (я пока что эмулирую их), я не могу повлиять на их внешний интерфейс, мне его представляют как данность. И мое серверное приложение должно брать на себя ответственность за доставку данных.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38719185
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Geronemo И мое серверное приложение должно брать на себя ответственность за доставку данных.
+ сохранение ответов от внешних серверов и ведение всякого рода отчетности.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38719330
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал проверку системы. 50000 запросов и ни один не потерялся.

Но тут у меня возникает еще один вопрос. Через день непрерывной работы (а именно такая и предполагается ) в таблице OperationTable будет несколько миллионов записей. Сдается мне, что с т. з. быстродействия с этим надо что-то делать.

Например, завести 3-ю таблицу ArchiveOperationTable, куда перемещать данные раз в сутки из OperationTable.
Но тут возникает еще 2 вопроса .

1 . Когда-нибудь таблице ArchiveOperationTable будут миллиарды записей и она будет раз в сутки пополняться на несколько миллионов. Возможны ли тут висяки ? Или нехватка дискового пространства . Как с этим борются в реальных системах. Держать архив за месяц ? Но не хотелось бы удалять данные даже через год.
Возможное решение - сделать отдельный сервер (физический сервер + прорамму сервер), который будет раз в сутки извлекать данные с нашего сервера и опустошать таблицу OperationTable (можно предшествующие сутки, т. е. данные за последние сутки оставлять в OperationTable, а все что раньше отправлять). А на этом новом сервере пусть уже будет много HDD и он сам будет разбираться с архивом. Там быстродействие большое не нужно, все-таки обращение к этому серверу не будет в реальном времени, а скорее администраторы системы будут проверять какие-то ошибки и делать это чуть ли не вручную (например, найти транзакцию с id = 123456789) и посмотреть ее детали.

2. Допустим мы раз в сутки (допустим наступило 13.08.2013, 00:00:00) делаем такую последовательность операций
1. Читаем все операции до 12.08.2013, 00:00:00
2. Отправляем их на архивный сервер (вот тут я в сомнениях - может все же сервер должен быть один, как и БД)
3. Удаляем все операции, датированные ранее 12.08.2013, 00:00:00
На практике мы будем иметь такую картину. Раз в полночь несколько миллионов записей читаются из таблицы OperationTable, а затем они же оттуда удаляются. Т. е. происходит 2 большие операции над таблицей. Но клиенты в полночь спать ведь не ложатся. Они будут все так же обращаться к нашему серверу и мне хотелось бы понять, возможно ли в это время зависание или падение системы и если ДА, то как с этим можно бороться
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38719349
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeronemoСделал проверку системыВы уж пишите, какой вариант проверяете - мой, мастерзива или какой-то ещё.
Geronemoто как с этим можно боротьсяА что мешает запускать удалятор раз в минуту, например? И чистить им записи опять же старше минуты. Или вообще объединить выборку с удалением?
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38719374
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirGeronemoСделал проверку системыВы уж пишите, какой вариант проверяете - мой, мастерзива или какой-то ещё.

Ваш вариант, конечно. Очень удобно и быстро. Спасибо.

Geronemoто как с этим можно боротьсяА что мешает запускать удалятор раз в минуту, например? И чистить им записи опять же старше минуты. Или вообще объединить выборку с удалением?

Ну тут такой момент. За внешние серверы мы не отвечаем, они могут прислать ответ и через 3 часа (серверы Вконтакте из-за жары, например, были недоступны несколько часов около 2-х недель назад). А вообще я не знаю, как тут лучше быть. Архивная таблица нужна, как и удалятор, но как их лучше сконфигурировать, это надо хорошо подумать.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38719774
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo, то есть имелась в виду чистка уже той таблицы, куда записи пришли? я думал, речь про исходную, куда они со всех серверов валятся.
ну если у вас не майисам, то удаление пусть даже и миллиона записей на скорость работы если и повлияет, то слабо.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38719805
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirGeronemo, то есть имелась в виду чистка уже той таблицы, куда записи пришли?

Да, речь про 2-ю таблицу (OperationTable)
Сначала в нее перемещаются данные из временной таблицы (раз в несколько секунд). Затем отдельный поток перекидывает эти данные обработчикам, которые отрабатывают с внешними серверами и возвращают какой-то результат, который мы пишем в эту таблицу. На этом, можно сказать, наша работа закончена. Клиент сделал запрос, мы его распарсили, отправили куда надо и сохранили результат.
Но со временем в этой таблице накопится сотни миллионов записей и, учитывая, что в нее постоянно кто-то обращается, будут большие тормоза.

Вот почему я задумался о том, что надо заиметь еще одну - архивную таблицу, куда бы перемещались неактуальные данные из OperationTable.
Приведу пример. Вы заходит в интернет-банк и совершаете там платеж за услуги оператора связи. Какое-то время ваша операция будет храниться в списке активных операций. Пока до нее дойдет очередь, пока будет налажено соединение с оператором связи, передача данных, ответ оттуда. И когда мы получаем ответ, то эта наша операция уже не так важна, мы можем ее переместить в архив, а клиент, если вдруг будет не доволен качеством услуги (деньги заплатил, а на счет они не пришли), то может пожаловаться, сообщив id операции (ее он получает при первом обращении к серверу) и администраторы могут заглянуть в архив и посмотреть, что не так.

Вот я и думаю, как лучше такое реализовать. На словах все очень просто. Но много вопросов - как часто перемещать данные исполненных запросов в Архив. Какой архив иметь - за все время (допустим, система будет все еще работать через 10 лет и придут ребята из органов, попросят данные 10-летней давности) или же иметь какой-нибудь срок давности, например год, а все остальное на удаление (или запись на Blu-ray и диск в ящик). Также интересно, в какое время перекидывать данные из OperationTable в Архив. У меня мысль такая. Допустим сейчас 5 утра 13.08. Ночью активность явно поменьше, чем днем. В это время можно устроить перенос данных с датой < 13.08.2014, 00:00:00.
Также можно создать 4-ю таблицу, в которую в 5 утра будут перемещаться данные из OperationTable, по которым от соответствующего внешнего сервера пришел ответ "error" или ответ не пришел.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720119
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Появился еще один вопрос.

Касательно самой первой временной таблицы (напомню, что я пишу на java и работаю с БД)
При обращении клиента к серверу и я делю insert в эту таблицу, там пишутся все данные (в том числе timestamp) и в результате на выходе получаю получаю id, но мне также надо еще и текущее время. Я могу сделать сразу же после insert'а select по id и получить время, но я тут озабочен быстродействием, есть ли способ получить время в одном запросе.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720139
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,

к сожалению, returning в mysql нет, так что только вторым запросом.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720159
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поясню вопрос.

Сейчас я делаю 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.
Как я написал выше, я довольно сильно озабочен быстродейстием.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720161
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirGeronemo,

к сожалению, returning в mysql нет, так что только вторым запросом.

Пока писал свое обобщение вопроса, вы мне ответили. Ок буду делать 2-й запрос. Жаль на форуме нельзя рейтинги ставить, я бы Вам плюсанул ))
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720188
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo, ну как вариант - если вы вставляете по одной записи - можно сделать хранимку, которая будет отдавать всё что угодно. Но "у ней унутре" опять же будет второй запрос, так что сэкономить тут удастся разве что на собственно посылке запроса по сети - а если жаба и скуль живут на одной машине, то эта экономия имхо будет совершенно призрачной.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720321
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720414
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторто эта экономия имхо будет совершенно призрачной.
я б так не стал заявлять.
время на переключение между программами, хоть и мало, но при тех требованиях, что у тс может играть роль.
думаю, что передав часть логики в хранимку можно сэкономить приличное время.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720430
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя, не могли бы пояснить, я не совсем в курсе sql-жаргона, что такое хранимка.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720489
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хранимка - хранимая процедура
http://yandex.ru/yandsearch?text=mysql хранимые процедуры&from=fx3&clid=1909644
вещь очень полезная.
для твоей цели - (очень грубо говоря) резместить оба запроса в хранимку и на этом сэкономить время на переключении между приложениями.
ну а правильно - переложить туда весь анализ и пр.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720509
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вызов хранимки без возврата результата
Код: java
1.
2.
3.
 con = DriverManager.getConnection(Singleton.getBase(), Singleton.getBase_login(), Singleton.getBase_password());
 proc = con.prepareCall("{ call имя_процедуры(" + param + ")}");
 proc.executeQuery();


с возвращением результата
Код: java
1.
2.
3.
4.
5.
con = DriverManager.getConnection(Singleton.getBase(), Singleton.getBase_login(), Singleton.getBase_password());
proc = con.prepareCall("{ call имя_процедуры(" + param + ")}");
rs = proc.executeQuery();
rs.next();
rs.getString("имя столбца") - результат хранимки
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720512
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя, спасибо. Пока сделал в 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)
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720531
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если у тебя мульоны данных в таблице (куда вставляешь) - первый быстрее,
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720561
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
 UPDATE `table` SET `field` = CASE `id`
WHEN val1 THEN data1
WHEN val2 THEN data2
ELSE `field` END



в данном варианте выяснение чир вставлять я бы вынес из запроса
в java
запрос стал таким
Код: sql
1.
UPDATE `table` SET `field`=нужное
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720565
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ
а если id не рано ни val1, ни val2, тогда и запрос вызывать не надо
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720671
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя, спс за хранимку ))

В моем случае
1. Вы правы, у меня мульон записей
2. данные с полученным id процентов на 99 присутсвуют ()кроме каких-то форс-мажоров)

/quot]
в данном варианте выяснение чир вставлять я бы вынес из запроса
в java
запрос стал таким
Код: sql
1.
UPDATE `table` SET `field`=нужное

[/quot]

А вот тут есть вопрос. Я читал, что разного рода логика в MySQL Работает быстрее и потому всякие поиски по id, сортировки лучше переложить на БД, ( например, лучше сделать один большой запрос, чем много простых в цикле). Или может я вашу мысль неправильно понял.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720780
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
 UPDATE `table` SET `field` = CASE `id`
WHEN val1 THEN data1
WHEN val2 THEN data2
ELSE `field` END



если мульон, то это странный запрос.
в зависимости от id он поменяет во всём мульоне в поле field значение на data1 или data2 или на прежнее
зачем менять на прежнее во всём мульоне? по факту ничено не изменится, только потратится время.

либо приведенный запрос не верен.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38721135
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя
Код: sql
1.
2.
3.
4.
 UPDATE `table` SET `field` = CASE `id`
WHEN val1 THEN data1
WHEN val2 THEN data2
ELSE `field` END



если мульон, то это странный запрос.
в зависимости от 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);
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38721246
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверно будет грубовато, но инет богат мануалами, и даже на русском.
http://yandex.ru/yandsearch?text=mysql update&from=fx3&clid=1909644
http://phpclub.ru/mysql/doc/update.html

если хочешь научиться, скачай dbForge, там в удобном виде , с шаблонами, с gui, можно пробовать(только не на боевой базе, конечно)
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38721277
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадянаверно будет грубовато, но инет богат мануалами, и даже на русском.
http://yandex.ru/yandsearch?text=mysql update&from=fx3&clid=1909644
http://phpclub.ru/mysql/doc/update.html

если хочешь научиться, скачай dbForge, там в удобном виде , с шаблонами, с gui, можно пробовать(только не на боевой базе, конечно)

Вовсе не грубовато. Я постоянно почитываю такого рода и много вещей делаю сам. А сюда задаю вопросы, если есть какие-то сомнения или, если я наткнулся на ошибку, которая отнимает много времени.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38721498
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зупустил 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)
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38721582
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так общаюсь с базой
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
try {
            con = DriverManager.getConnection(getBase, getBase_login, getBase_password);
            proc = con.prepareCall("{ call page1('" + param + "')}");
            rs = proc.executeQuery();
            while(rs.next()){
ля-ля
            }
        } catch (SQLException ex) {
            Logger.getLogger(SSLServer.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                proc.close();
                rs.close();
                con.close();
            } catch (SQLException ex) {
                Logger.getLogger(SSLServer.class.getName()).log(Level.SEVERE, null, ex);
            }


а ты?
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38721959
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя, у меня похоже некоторые исключения не обрабатывались, сейчас я привел код к такому виду.

Кстати, утром поставил симуляция, получилось 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.
 Connection cn = null;
        Statement st = null;

        try {
            cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/PaymentServer?user=root&password=xxxxxx");

            ResultSet rs = null;

            st = cn.createStatement();

            StringBuilder updateQuery = new StringBuilder("");
            if (listsOfResponses.getResponseList().size() > 0) {
                for (ResponseFromOperator responseFromOperator : listsOfResponses.getResponseList()) {
                    st.addBatch("UPDATE OperationtTable SET paymentresult = '" + responseFromOperator.getResponse() + "' WHERE paymentid = " + responseFromOperator.getId() + ";");
                }

                st.executeBatch();

                st.close();
                cn.close();
            }
        }

        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try {

                st.close();
                cn.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38722027
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
Connection cn = null;
        Statement st = null;

        try {
            cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/PaymentServer?user=root&password=xxxxxx");

            ResultSet rs = null;

            st = cn.createStatement();

            StringBuilder updateQuery = new StringBuilder("");
            if (listsOfResponses.getResponseList().size() > 0) {
                for (ResponseFromOperator responseFromOperator : listsOfResponses.getResponseList()) {
                    st.addBatch("UPDATE OperationtTable SET paymentresult = '" + responseFromOperator.getResponse() + "' WHERE paymentid = " + responseFromOperator.getId() + ";");
                }

                st.executeBatch();

                st.close(); ------------------------это лишнее
                cn.close(); -----------------------это лишнее
            }
        }

        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try {

                st.close();
                cn.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38722032
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя ? это была ошибка копи-паста. 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)
.......

Может можно как-то ограничить количество одновременных соединений с БД и приказать потокам вставать в очередь ?
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38722312
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня возникла идея.

Самые частый обращения к БД идут от клиентов, коих >1000 и запросов приходит несколько сотен в сек. Что если метод, который сохраняет данные в БД не будет закрывать соединение с БД.

Или 2-я идея.
Организовать вот такую конструкцию.
private Connection connectToDB ()
{
Connection cn = null;

try {
cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/PaymentServer?user=root&password=123");
}
catch (Exception e) {
{
e.printStackTrace();
}
}
return cn;
}

А где-нибудь в теле метода сохранения данных от клиента сделать так
while ((cn = connectToDB()) == null)
Thread.sleep(100);
За 100 миллисекунд мы даем возможность всем потокам закрыть соединение с БД и исключения
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)
недолжно возникать.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38722475
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть подозрение, что ты упираешься по быстродействию файловой системы.
если есть возможность попробуй на ssd базу разместить а лучше ssd поставить в raid
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38722538
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяесть подозрение, что ты упираешься по быстродействию файловой системы.
если есть возможность попробуй на ssd базу разместить а лучше ssd поставить в raid

У меня база на SSD
У меня такое же соображение, что все упирается в файловую систему. Причем даже есть косвенные д-ва этому. У меня в некоторых местах было логгирование, типа создать файл номер 22345 и записать туда данные, полученные от клиента. Я так понимаю, что такого рода операции были что-то типа sleep На 5 миллисекунд и у БД было чуть больше времени, чтобы выполнить операцию и закрыть соединение. Потому как раньше поток исключений начинался после 70000 операций, а сейчас после 20000-30000.

Надо помозговать, как еще можно что-то соптимизировать. Хотя, может и нету такой возможности, все-таки я работаю за домашним компом, а не с навороченным сервером.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38722559
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
замени

StringBuilder updateQuery = new StringBuilder(200 ); (200 это к примеру)


"UPDATE OperationtTable SET paymentresult = '" + responseFromOperator.getResponse() + "' WHERE paymentid = " + responseFromOperator.getId() + ";"

на

for (.....)
{
updateQuery.append("UPDATE OperationtTable SET paymentresult = '" )
.append( responseFromOperator.getResponse() )
.append("' WHERE paymentid = " )
.append(responseFromOperator.getId())
.append(";")
st.addBatch(updateQuery>toString);
st.executeBatch();
updateQuery.delete(1,200);
}

чему равно количестчо циклов?
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38722681
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так правильнее
for (.....)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
{
updateQuery.append("UPDATE OperationtTable SET paymentresult = '" )
.append( responseFromOperator.getResponse() )
.append("' WHERE paymentid = " )
.append(responseFromOperator.getId())
.append(";")
st.addBatch(updateQuery.toString);

updateQuery.delete(1,200);
}
st.executeBatch();
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38723038
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemoу меня возникла идея.

Самые частый обращения к БД идут от клиентов, коих >1000 и запросов приходит несколько сотен в сек. Что если метод, который сохраняет данные в БД не будет закрывать соединение с БД.

Или 2-я идея.
Организовать вот такую конструкцию.
private Connection connectToDB ()
{
Connection cn = null;

try {
cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/PaymentServer?user=root&password=123");
}
catch (Exception e) {
{
e.printStackTrace();
}
}
return cn;
}

А где-нибудь в теле метода сохранения данных от клиента сделать так
while ((cn = connectToDB()) == null)
Thread.sleep(100);
За 100 миллисекунд мы даем возможность всем потокам закрыть соединение с БД и исключения
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)
недолжно возникать.

ок, вы созрели для коншн-пула :-)

напромер такой:
http://www.snaq.net/java/DBPool/

кстати, хибернат имеет конекш-пул сразу.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38723805
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадятак правильнее
for (.....)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
{
updateQuery.append("UPDATE OperationtTable SET paymentresult = '" )
.append( responseFromOperator.getResponse() )
.append("' WHERE paymentid = " )
.append(responseFromOperator.getId())
.append(";")
st.addBatch(updateQuery.toString);

updateQuery.delete(1,200);
}
st.executeBatch();



StringBuilder updateQuery = new StringBuilder(200);

if (listsOfResponses.getResponseList().size() > 0) {
for (ResponseFromOperator responseFromOperator : listsOfResponses.getResponseList()) {
updateQuery.append("UPDATE OperationTable SET paymentresult = '");
updateQuery.append(responseFromOperator.getResponse());
updateQuery.append("' WHERE paymentid = ");
updateQuery.append(responseFromOperator.getId());
updateQuery.append(";");
st.addBatch(updateQuery.toString());
updateQuery.delete(1,200);
}
st.executeBatch();
}

Переделал по вашему подобию, спс за совет, так будет быстрее работать.

Циклов штук 70. Но я могу настраивать частоту появления запросов от клиента. Моей следующей задачей будет имитация 24-х часового периода. Чтобы были часы пик и периоды практической тишины (в это время буду очищать таблицу операций и перекидывать все в таблицу Архива)
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38726772
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя
for (.....)
{
updateQuery.append("UPDATE OperationtTable SET paymentresult = '" )
.append( responseFromOperator.getResponse() )
.append("' WHERE paymentid = " )
.append(responseFromOperator.getId())
.append(";")
st.addBatch(updateQuery>toString);
st.executeBatch();
updateQuery.delete(1,200);
}

чему равно количестчо циклов?

Ко мне тут заходил знакомый java-программист, смотрел код. Он сказал, что когда делаются куча однотипных действий, то лучше использовать Preparecall со знаками '?', а потом делать setPAram. И все это дело в цикле. Честно говоря, я не уверен в его правоте. А как вы думаете ?
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38726803
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или же еще один вариант, где возможно Preparecall лучше.

E мея в секунду поступает около 300 запросов (каждый в своем потоке) от клиентов и их я помещаю в БД. Возможно вот эту запись лучше лучще сделать с помощью preparecall. Ну то что StringBuilder лучше текущего варианта, это я понимаю.

String query = "insert into TempTable (clientid, paymenttype, account, paymentvalue) values " +
"(" + payment.getClientId() + ",'" + payment.getType() + "', " + payment.getAccount() + ", " + payment.getValue() + ")";
int id = -1;
st.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38727068
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Preparecall лучше если ты применишь его вместо текущего способа.
а если всё в разных потоках и в разных коннектах - не поможет.

как вариант(если у тебя цикл из 70± ) - можно попробовать все данные сформировать в строку с разделителем и отправить в хранимку, а там в цикле парсить и делать дело.
тут нет гарантии что будет быстрее, но и медлееннее - не факт.
было б интересно узнать результатты такого опыта.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38727417
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemoвадяfor (.....)
{
updateQuery.append("UPDATE OperationtTable SET paymentresult = '" )
.append( responseFromOperator.getResponse() )
.append("' WHERE paymentid = " )
.append(responseFromOperator.getId())
.append(";")
st.addBatch(updateQuery>toString);
st.executeBatch();
updateQuery.delete(1,200);
}

чему равно количестчо циклов?

Ко мне тут заходил знакомый java-программист, смотрел код. Он сказал, что когда делаются куча однотипных действий, то лучше использовать Preparecall со знаками '?', а потом делать setPAram. И все это дело в цикле. Честно говоря, я не уверен в его правоте. А как вы думаете ?


1. препаре стейтмент имеют большой шанс сильно укорить здесь.
Опятже, без конекш-пула это все бестолку

2. всегда полезно попробовать альтернативные варианты. т.е.
поможет-непоможет, но ислледовать в познавательных целях -- обязательно.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38728032
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужна помощь. Около суток не могу понять, что происходит с Томкатом. Я навводил кучу логгирования по всему коду и вижу, что выполняется не мое приложение, а то, что было, часов 12 назад.

Далее я обнаружил ошибку в коде
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for (.....)
{
updateQuery.append("UPDATE OperationtTable SET paymentresult = '" )
.append( responseFromOperator.getResponse() )
.append("' WHERE paymentid = " )
.append(responseFromOperator.getId())
.append(";")
st.addBatch(updateQuery>toString);
st.executeBatch();
updateQuery.delete(1,200);
}


В файле логов stderr Томката по этому поводу написано
java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' UUPDATE OperationTable SET paymentresult = 'suсcess' WHERE paymentid =' at line 1
at com.mysql.jdbc.StatementImpl.executeBatch(StatementImpl.java:1196)
Тупо скопировав текст и, решив, что updateQuery.delete( 1 ,200) это правильно, т. к. мне тут так написали я допустил ошибку в ситаксисе, но исправив на updateQuery.delete( 0 ,200) у меня вылетает все та же ошибка, как в логах, так и при просмотре таблицы OperationTable (в колонке paymentresult должно стоять везде 'suсcess', а у меня только у 1-го платежа данного типа, у остальных со времен предыдущей записи стоит 'processing' ).

Более того я пошел далее.
Я решил поменять всю эту конструкцию на

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            preparedStatement = cn.prepareStatement(
                    "UPDATE OperationPaymentTable SET paymentresult = ? WHERE paymentid = ?;");

                for (ResponseFromOperator responseFromOperator :listsOfResponses.getResponseList()) {

                    preparedStatement.setString(1, responseFromOperator.getResponse());
                    preparedStatement.setInt(2, responseFromOperator.getId());

                    preparedStatement.executeUpdate();
                } 



Но Томкат меня почему-то не воспринимает. Я и перезапускал его и перегружал комп, а он все равно выдает ошибку в логе
java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' UUPDATE OperationTable SET paymentresult = 'suсcess' WHERE paymentid =' at line 1
at com.mysql.jdbc.StatementImpl.executeBatch(StatementImpl.java:1196)
Что за бред. Я уже 100 раз код поменял, откуда это вылазит ?
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38728041
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так, возможно нашел, откуда ноги растут, но что с этим делать все еще не понимаю. В логе Томката catalina2014-8-25
есть такое
авторINFO: validateJarFile(C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\PaymentServer\WEB-INF\lib\ servlet-api-2.5.jar) - jar not loade d. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/servlet/Servlet.class
авг 25, 2014 1:12:33 PM org.apache.catalina.deploy.WebXml setVersion
WARNING: Unknown version string [3.1]. Default version will be used .

Интересно, почему ему не нравится этот файл. Он лежит в папке lib с давних времен (скорее всего, т. к. я настройками не увлекался последнее время). И еще - что еще за Default version они тут собрались использовать.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38728057
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще подкину инфу. Проект у меня maven и в pom.xml вот такое прописано.

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38728081
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в файле tomcat7-stderr.2014-08-25.log
все так и вываливается ошибка
авторjava.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' UUPDATE OperationTable SET paymentresult = 'sucess MTS' WHERE paymentid = ' at line 1
at com.mysql.jdbc.StatementImpl.executeBatch(StatementImpl.java:1196)
at DB.ModifyPaymentStatus(DB.java:280)
Что за бред. Этой SQL строки в моем проекте уже давно нету. Такое ощущение, что я пересобираю проект (и помещаю его в webapp ) каждый раз впустую, а Томкат все равно бкркт его версию 2-дневной давности из х. з. какого кэша.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38728213
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался !!! Пришлось создавать заново maven-проект, с другим именем, но таким же содержанием.
В чем суть была, не знаю. Похоже где-то в кэше застряла версия проекта 2-хдневной давности и все время запускалась она. Хоть мне разок и удалось ее отредактировать - напихать кучу логов. Но дальше мне уже ничего не помогало.

В общем создал я таблицу Архива, запущу большое тестирование, посмотрим, как пойдет.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38728288
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,

много лун тому назад в Томкате была фишка что надо
удалят- компилированые классы из рабочей директории
что бы подгрузить новую версию.

Но в вашем случае вроде все проше -- пока не почините
указаный ХМЛ Томкат даже не будет пытатся
задеплоить новый жар.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #39001804
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил сделать небольшой рефакторинг проекта.

1. Теперь у меня не 5 проектов, а 1, в котором есть модули типа common и не надо дублировать кучу информации.
2. Я решил сделать 2 версии клиентского приложения и 2 версии web-tier слоя серверной части (REST и SErvlets).
3. Пакет business, в котором вся логика, там несколько EJB бинов, а также....
и вот тут возникает вопрос Я бы тут хотел иметь несколько постоянно функционирующих потоков, которые раз в несколько секунд дергали эти EJB бины, чтобы те апдейтили базу.
В общем, я не знаю, как стартовать эти потоки. Должен быть какой-то Application с функцией типа main, но у меня там EJB бины. Похоже я тут немного запутался.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #39005523
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeronemoРешил сделать небольшой рефакторинг проекта.

1. Теперь у меня не 5 проектов, а 1, в котором есть модули типа common и не надо дублировать кучу информации.
2. Я решил сделать 2 версии клиентского приложения и 2 версии web-tier слоя серверной части (REST и SErvlets).
3. Пакет business, в котором вся логика, там несколько EJB бинов, а также....
и вот тут возникает вопрос Я бы тут хотел иметь несколько постоянно функционирующих потоков, которые раз в несколько секунд дергали эти EJB бины, чтобы те апдейтили базу.
В общем, я не знаю, как стартовать эти потоки. Должен быть какой-то Application с функцией типа main, но у меня там EJB бины. Похоже я тут немного запутался.



...вашето тут форум по мускл...

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


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