|
|
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Всем привет. Я давно не имел дела с 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 есть инструменты, получающие эксклюзивный доступ к таблице на время выполнения нескольких операций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 13:13:23 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Geronemo, а вы пишите во врем.таблицу время появления каждой записи (добавьте в таблицу поле timestamp defaul current_timestamp) и обрабатывайте каждый раз, допустим, не все записи, а только те, что старше (текущее время - интервал запуска батча) думаю, отставание в 1 секунду будет некритично, а другие варианты будут куда замороченнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 13:21:32 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
мдя...он походу никогда не имел дело с sql :) - исходя из постановки вопроса, только начал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 13:27:39 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
alex564657498765453мдя...он походу никогда не имел дело с sql :) - исходя из постановки вопроса, только начал. Имел дело несколько лет назад, но даже тогда это не было моей прямой обязанностью. Просьба писать по существу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 13:53:27 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Придумал еще одно решение проблемы. У меня в таблице TempTable есть id auto_increment И это поле я также читаю и сохраняю для последующей обработки. В принципе, в п. 3. удаление записей я могу сделать по списку этих id Но может можно сделать проще средствами java (Вопрос к знатокам java) допустим такой код (1) Statement statement = сonnection.createStatement() .... Чтение всех данных из TempTable .... Запись данных в OperationTable .... Удаление всех записей из TempTable (N) statement.close() Можно ли на участке кода от строчки кода номер 1 до N зпретить кому бы то ни было извне обращаться к таблице TempTable ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 14:48:56 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
на чтение - нет посмотри в сторону хранимых процедур- возможно в них логику перенести и будет тебе счастье. а решение 16430816 лучший вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 15:53:30 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Geronemo, 16430816 -- стандартное хорошее решение. (Есть варианты, например с дополнительной колонкой статуса) Алаверды : предложеное решение отличается от того что вы спрашиваете по нескольким позициям: 1. вместо работы со всей таблицей у вас есть гибакая возможность обрабатывать очередь по частям, возможно даже в несколько потоков. 2. Блокировка переносится с "физической" базы в логику аппликации -- больше контроля и гибкости. 3. Логическая блокировка (по ид, таймстампу, по колонке статуса) может длится как угодно долго. Долгие физические блокировки крайне не рекомендуются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 18:58:26 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Вариант с 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'. И мы удалим в том числе и их. Может есть какая-нибудь функция, дающая более точное время, с миллисекундами. Или же я что-то не так понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 21:32:42 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Geronemo, Поставьте верхний предел обработки как текушее время МИНУС одна (или 3, если нервы дроже) секунда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 21:39:11 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Geronemo, две временные таблицы. > Также есть на сервере есть программа, которая раз в несколько секунд (например раз в 1 секунду). 1. Сообщает сервлету, что начинает чтение из таблицы [1] (сервлет начинает писать в таблицу [2]). Читает ВСЕ записи в таблице [1] 2. Сохраняет их в таблицу операций OperationTable, а также сохраняет в памяти 3. Удаляет все записи из таблицы [1] 4. дальнеяшая обработка данных из памяти. 5. Сообщает сервлету, что начинает чтение из таблицы [2] (сервлет начинает писать в таблицу [1]) ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 23:18:39 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Спасибо. Все заработало. Надо еще какое-то время погонять, чтобы убедиться, что данные не пропадают, но в целом думаю, что все норм. Есть еще один вопрос, не буду создавать новую тему. Что вы думаете по поводу Java Hibernate, стоит ли заморачиваться с ним, когда у меня БД очень простая. Или же лучше всегда использовать Hibernate, просто потому что так правильнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 23:28:43 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Stupid_BOT, временная таблица у меня одна. Та, 2-я это итоговая таблица, куда скидываются все данные от клиентов, а также потом происходит некоторая их обработка (а конкретно модификация одного поля - Статус, который мжет иметь несколько значений, типа 'В процессе', 'успешно', 'ошибка'....) Возвращать результат обработки клиенту задачей не предусмотрено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 23:35:57 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Geronemo, я так понял, что и сервлет, и "серверная" программа - оба могут быть Вами модифицированы. И предложил вариант с переключением временных таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 00:04:54 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
GeronemoСпасибо. Все заработало. Надо еще какое-то время погонять, чтобы убедиться, что данные не пропадают, но в целом думаю, что все норм. Есть еще один вопрос, не буду создавать новую тему. Что вы думаете по поводу Java Hibernate, стоит ли заморачиваться с ним, когда у меня БД очень простая. Или же лучше всегда использовать Hibernate, просто потому что так правильнее. Нету такого понятия как "правильнее". Все "зависит от". Для расширения кругозора кибернат ооочень полезен, как и знать что такое обжект-релейшнл мапинг (ORM). Конкретно к вашему проекту -- 2 таблицы и 3 класса -- нафик не надо, но если есть время -- сделайте в отдельном бранче, что бы знать на будушее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 00:22:43 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
0. начать транзакцию. 1. Читать по одной записи в таблице TempTable. читать с for update. 2. Сохранять их в таблицу операций OperationTable, а также сохраняет в памяти 3. Удалять только что обработанную запись из таблицы TempTable 4. делать это все в цикле, пока есть записи. 5. при окончании набора входных записей завершить транзакцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 00:23:37 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Geronemo, вообще, тут напрашивается для использования jms, и никаких прямых работ с бд. правда, транзакции и там нужны будут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 00:27:17 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
GeronemoЕсли бы писали миллисекунды, то можно бы было разграничить данные. А так может получиться, что сервер извлекает все данные вплоть по '2014-08-12 21:05:54', например, и пока он сих обрабатывает клиентские приложения сделают еще несколько запросов и они будут датированы этим же значением '2014-08-12 21:05:54'. И мы удалим в том числе и их. Может есть какая-нибудь функция, дающая более точное время, с миллисекундами.Почему вы считаете, что миллисекунды совпасть не могут? :) javajdbcGeronemo, Поставьте верхний предел обработки как текушее время МИНУС одна (или 3, если нервы дроже) секунда.Я об этом уже писал, кстати. В том самом посте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 10:24:59 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
MasterZiv0. начать транзакцию. 1. Читать по одной записи в таблице TempTable. читать с for update. 2. Сохранять их в таблицу операций OperationTable, а также сохраняет в памяти 3. Удалять только что обработанную запись из таблицы TempTable 4. делать это все в цикле, пока есть записи. 5. при окончании набора входных записей завершить транзакцию. Спасибо за предложенный вариант, но тут есть нюансы, а которых я не указал первоначально. Возникает вопрос о быстродействии, если повысить частоту получения данных от клиентов. + у меня п. 1. организован таким образом, что в цикле происходит select * TempTable where operation_type = "несколько видов операций". Мне разделение по типам операций нужно, чтобы создать несколько массивов однотипных данных и отправлять обработчикам их массивами, а не по по одному. В вашем варианте, как мне кажется можно было бы обойтись вообще без TempTable, просто писать сразу в таблицу OperationTable и добавить в поле статуса вариант значения "данные только что получены от клиента" и потом апдейтить его. Весь смысл существования временной таблицы в том, что на входе у нас запросы от тысяч клиентов, а на выходе мы должны отослать данные небольшому количеству внешних серверов неким пакетом и получить ответ. Для этого я накапливаю большое количество записей во временной таблице, а потом раз в несколько секунд извлекаю их оттуда, группирую по типу операций и делаю всего штук 5-10 запросов на внешние серверы. Я так понимаю, что процесс извлечения данных из БД происходит значительно быстрее, чем установка соединения с внешним сервером (которых было бы тысячи). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 11:53:04 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
tanglir, спасибо за совет. Никто у вас не отнимает лавры, просто я ваше предложение, похоже, не совсем внимательно изучил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 11:55:30 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
MasterZivGeronemo, вообще, тут напрашивается для использования jms, и никаких прямых работ с бд. правда, транзакции и там нужны будут. тут у меня дело в том, что клиенты и внешние серверы это программы, написанные сторонними людьми (я пока что эмулирую их), я не могу повлиять на их внешний интерфейс, мне его представляют как данность. И мое серверное приложение должно брать на себя ответственность за доставку данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 12:00:53 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Geronemo И мое серверное приложение должно брать на себя ответственность за доставку данных. + сохранение ответов от внешних серверов и ведение всякого рода отчетности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 12:11:24 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Сделал проверку системы. 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 большие операции над таблицей. Но клиенты в полночь спать ведь не ложатся. Они будут все так же обращаться к нашему серверу и мне хотелось бы понять, возможно ли в это время зависание или падение системы и если ДА, то как с этим можно бороться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 13:36:20 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
GeronemoСделал проверку системыВы уж пишите, какой вариант проверяете - мой, мастерзива или какой-то ещё. Geronemoто как с этим можно боротьсяА что мешает запускать удалятор раз в минуту, например? И чистить им записи опять же старше минуты. Или вообще объединить выборку с удалением? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 13:51:40 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
tanglirGeronemoСделал проверку системыВы уж пишите, какой вариант проверяете - мой, мастерзива или какой-то ещё. Ваш вариант, конечно. Очень удобно и быстро. Спасибо. Geronemoто как с этим можно боротьсяА что мешает запускать удалятор раз в минуту, например? И чистить им записи опять же старше минуты. Или вообще объединить выборку с удалением? Ну тут такой момент. За внешние серверы мы не отвечаем, они могут прислать ответ и через 3 часа (серверы Вконтакте из-за жары, например, были недоступны несколько часов около 2-х недель назад). А вообще я не знаю, как тут лучше быть. Архивная таблица нужна, как и удалятор, но как их лучше сконфигурировать, это надо хорошо подумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 14:12:37 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Geronemo, то есть имелась в виду чистка уже той таблицы, куда записи пришли? я думал, речь про исходную, куда они со всех серверов валятся. ну если у вас не майисам, то удаление пусть даже и миллиона записей на скорость работы если и повлияет, то слабо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 19:11:30 |
|
||
|
Вопрос о целостности данных. 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 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
у меня возникла идея. Самые частый обращения к БД идут от клиентов, коих >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) недолжно возникать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 11:58:49 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
есть подозрение, что ты упираешься по быстродействию файловой системы. если есть возможность попробуй на ssd базу разместить а лучше ssd поставить в raid ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 13:51:21 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
вадяесть подозрение, что ты упираешься по быстродействию файловой системы. если есть возможность попробуй на ssd базу разместить а лучше ssd поставить в raid У меня база на SSD У меня такое же соображение, что все упирается в файловую систему. Причем даже есть косвенные д-ва этому. У меня в некоторых местах было логгирование, типа создать файл номер 22345 и записать туда данные, полученные от клиента. Я так понимаю, что такого рода операции были что-то типа sleep На 5 миллисекунд и у БД было чуть больше времени, чтобы выполнить операцию и закрыть соединение. Потому как раньше поток исключений начинался после 70000 операций, а сейчас после 20000-30000. Надо помозговать, как еще можно что-то соптимизировать. Хотя, может и нету такой возможности, все-таки я работаю за домашним компом, а не с навороченным сервером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 14:29:28 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
замени 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); } чему равно количестчо циклов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 14:49:42 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
так правильнее for (.....) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 16:28:57 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
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/ кстати, хибернат имеет конекш-пул сразу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 03:52:34 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
вадятак правильнее for (.....) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 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-х часового периода. Чтобы были часы пик и периоды практической тишины (в это время буду очищать таблицу операций и перекидывать все в таблицу Архива) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 19:13:17 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
вадя 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. И все это дело в цикле. Честно говоря, я не уверен в его правоте. А как вы думаете ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 14:56:02 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Или же еще один вариант, где возможно 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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 15:22:45 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Preparecall лучше если ты применишь его вместо текущего способа. а если всё в разных потоках и в разных коннектах - не поможет. как вариант(если у тебя цикл из 70± ) - можно попробовать все данные сформировать в строку с разделителем и отправить в хранимку, а там в цикле парсить и делать дело. тут нет гарантии что будет быстрее, но и медлееннее - не факт. было б интересно узнать результатты такого опыта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 18:50:18 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
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. всегда полезно попробовать альтернативные варианты. т.е. поможет-непоможет, но ислледовать в познавательных целях -- обязательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2014, 07:16:23 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Нужна помощь. Около суток не могу понять, что происходит с Томкатом. Я навводил кучу логгирования по всему коду и вижу, что выполняется не мое приложение, а то, что было, часов 12 назад. Далее я обнаружил ошибку в коде Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. В файле логов 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. Но Томкат меня почему-то не воспринимает. Я и перезапускал его и перегружал комп, а он все равно выдает ошибку в логе 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 раз код поменял, откуда это вылазит ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 13:10:12 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Так, возможно нашел, откуда ноги растут, но что с этим делать все еще не понимаю. В логе Томката 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 они тут собрались использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 13:22:39 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Еще подкину инфу. Проект у меня maven и в pom.xml вот такое прописано. <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 13:35:15 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
А в файле 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-дневной давности из х. з. какого кэша. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 14:00:44 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Разобрался !!! Пришлось создавать заново maven-проект, с другим именем, но таким же содержанием. В чем суть была, не знаю. Похоже где-то в кэше застряла версия проекта 2-хдневной давности и все время запускалась она. Хоть мне разок и удалось ее отредактировать - напихать кучу логов. Но дальше мне уже ничего не помогало. В общем создал я таблицу Архива, запущу большое тестирование, посмотрим, как пойдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 15:39:53 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Geronemo, много лун тому назад в Томкате была фишка что надо удалят- компилированые классы из рабочей директории что бы подгрузить новую версию. Но в вашем случае вроде все проше -- пока не почините указаный ХМЛ Томкат даже не будет пытатся задеплоить новый жар. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 16:45:28 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Решил сделать небольшой рефакторинг проекта. 1. Теперь у меня не 5 проектов, а 1, в котором есть модули типа common и не надо дублировать кучу информации. 2. Я решил сделать 2 версии клиентского приложения и 2 версии web-tier слоя серверной части (REST и SErvlets). 3. Пакет business, в котором вся логика, там несколько EJB бинов, а также.... и вот тут возникает вопрос Я бы тут хотел иметь несколько постоянно функционирующих потоков, которые раз в несколько секунд дергали эти EJB бины, чтобы те апдейтили базу. В общем, я не знаю, как стартовать эти потоки. Должен быть какой-то Application с функцией типа main, но у меня там EJB бины. Похоже я тут немного запутался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 21:02:36 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
GeronemoРешил сделать небольшой рефакторинг проекта. 1. Теперь у меня не 5 проектов, а 1, в котором есть модули типа common и не надо дублировать кучу информации. 2. Я решил сделать 2 версии клиентского приложения и 2 версии web-tier слоя серверной части (REST и SErvlets). 3. Пакет business, в котором вся логика, там несколько EJB бинов, а также.... и вот тут возникает вопрос Я бы тут хотел иметь несколько постоянно функционирующих потоков, которые раз в несколько секунд дергали эти EJB бины, чтобы те апдейтили базу. В общем, я не знаю, как стартовать эти потоки. Должен быть какой-то Application с функцией типа main, но у меня там EJB бины. Похоже я тут немного запутался. ...вашето тут форум по мускл... ...контейнер сам разберется с бинами... их не надо инстанциировать в ручную... читайте книжки по жабе, дезайну, архитектурам, бест практизе... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2015, 06:16:31 |
|
||
|
|

start [/forum/topic.php?all=1&fid=47&tid=1832955]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
117ms |
get tp. blocked users: |
2ms |
| others: | 218ms |
| total: | 436ms |

| 0 / 0 |
