17.11.2006, 13:02 | #1 |
Участник
|
2 Batch сервера - ошибка
Ax3.0SP2 + MS SQL2kSP3.
На одной машине (сервер), под одним логин, работают 2 пакетных сервера. Клиенты, в которых запущены пакетные группы, - Fat, пользватели (логины аксапты) разные. Вот работают себе эти 2 пакетника, обрабатывают 2-е разные пакетные группы, все хорошо и вдруг один оставливается с сообщением : "Невозможно выбрать запись в 'Пакетные проводки ' ('Batch') Приоритет: 0, .Тупиковая ситуация. Один или несколько пользователей одновременно блокировали всю таблицу или ее часть.". И так переодически. никто не сталкивался? что можно предпринять?
__________________
--- SHiSHok Последний раз редактировалось SHiSHok; 17.11.2006 в 13:04. Причина: граматика :) |
|
17.11.2006, 14:17 | #2 |
Участник
|
Сталкивался. Посмотрел код стало понятно, что блокировка происходит, когда производится update статуса в таблице Batch. Сделал следующее: уменьшил частоту сканирования таблицы Batch (по умолчанию было 30 сек, поставил 600 (10 мин)). Ошибка стала появляться значтельно реже (после изменения появилась всего один раз). Еще убрал все что касается статуса Ошибка т.к. не нашел что в нем полезного (если пакетный класс сваливается по exception, то статус пакета становится Error и пакет больше не запускается пока этот статус не сменишь руками).
|
|
17.11.2006, 14:28 | #3 |
Участник
|
ага. я в Батче тоже полазил и по максимуму сузил время действия транзакции (разделил на несколько где надо) - не помогло, а вот на счет сваливания со статусом ошибка и остановки это надо поковырять.
__________________
--- SHiSHok |
|
17.11.2006, 14:33 | #4 |
Участник
|
Транзакции я тоже менял, не помогло. Потом подумал - зачем раз в тридцать секунд искать в таблице, не нужно ли что-нибудь запустить, если у нас минимальный интервал запуска пакетов - 20 минут. 20 ставить не стал, поставил 10. Наверное не очень красивое решение, но зато помогает
|
|
17.11.2006, 16:24 | #5 |
Злыдни
|
У нас задачи пакетной обработки разделены по пакетным группам. Каждый пакетный сервер обрабатывает задания только своей группы. Может поэтому у нас блокировок практически нет?
|
|
17.11.2006, 16:51 | #6 |
Участник
|
Анннналогично. Пакетные серваки исполняют 2 разные пакетные группы, да и пакетные группы по своим функциям совершенно из разных опер (в общем-то с пересечением функционала проблем не возникало). Еще такой ньюансик: вылетает постоянно пакетник у которого название Пакетной Группы "ниже" (при сортировке по возрастанию) и так вышло RecId больше. Как то странно уж очень.
__________________
--- SHiSHok Последний раз редактировалось SHiSHok; 17.11.2006 в 16:55. |
|
17.11.2006, 17:04 | #7 |
Злыдни
|
Нашел правки в классах BatchRun и RunBaseBatch.
В runJob первого есть код проверки if (batch.JournalId) runBaseBatch.batchRecId(batchId); //после runBaseBatch.run(); Во втором: возврат RecId выполняемой задачи |
|
20.11.2006, 13:41 | #8 |
Модератор
|
Цитата:
Цитата:
Наверное не очень красивое решение
Можно сделать чуть тоньше - увеличить интервал очистки (смены статусов у пакетов, зависших в статусе "Выполнение", BatchRun.cleanUpExecuting()), лочится в основном там и на BatchRun.search() Плюс мелкий тюнинг индексов на Batch На выходные в таком режиме крутилась молотилка из шести пакетных серверов на шесть групп, периодичность у пакетов - минута (своего рода "песочница" - пакеты ничего полезного не делают)
__________________
-ТСЯ или -ТЬСЯ ? |
|
23.11.2006, 17:34 | #9 |
Участник
|
у нас пакетные журналы не используются.
__________________
--- SHiSHok |
|
23.11.2006, 18:00 | #10 |
Участник
|
Цитата:
Сообщение от Vadik
Пожалуй. Если пакетов много, система просто не будет успевать обрабатывать их, ну и время реакции на постановку пакета в очередь не фонтан
Можно сделать чуть тоньше - увеличить интервал очистки (смены статусов у пакетов, зависших в статусе "Выполнение", BatchRun.cleanUpExecuting()), лочится в основном там и на BatchRun.search() Плюс мелкий тюнинг индексов на Batch
__________________
--- SHiSHok |
|
30.11.2006, 14:30 | #11 |
Участник
|
отчет: почти неделя работы 2-х пакетных серверов без единой ошибки. можно с уверенностью (95% ) сказать что блокировались записи в BatchRun::cleanUpExecuting
Думаю не лишним будет поправить тем кто использует больше одного батч сервера: X++: server static public void cleanUpExecuting(boolean checkSession = false) { Batch _batch; Batch _batch4update; // SHiSHok while select _batch index hint StatusIdx where _batch.status == BatchStatus::Executing && _batch.sessionIdx > 0 { if (! _batch.isSessionActive(checkSession)) { // SHiSHok , 20061123 stability turnung--> ttsbegin; _batch4update=batch::findRecId(_batch.RecId,true); _batch4update.status = BatchStatus::Waiting; _batch4update.update(); ttscommit; // SHiSHok <-- } } }
__________________
--- SHiSHok |
|
|
За это сообщение автора поблагодарили: AlGol (2), MironovI (2), Antant (1). |