ODBC Error: Memory allocation failure

Deniro

Добрый день всем.Нарисовалась такая проблемка:Есть у нас:
select @@version
Microsoft SQL Server <b>2005</b> - <b>9</b>.<b>00</b>.<b>4262</b>.<b>00</b> (Intel X86) Aug <b>13</b> <b>2009</b> <b>17</b>:<b>08</b>:<b>37</b> Copyright (c) <b>1988</b>-<b>2005</b> Microsoft Corporation Enterprise Edition on Windows NT <b>5</b>.<b>2</b> (Build <b>3790</b>: Service Pack <b>2</b>)
Была у нас задача - сделать возможным запуск некоторого кол-ва джобов с коротким тайм-аутом между запусками: от 1 до 10 сек. Сделали для этого процедуру - которая исполняет заданный код, контролируя период времени, в течении которого должен "крутиться" код, тайм-аут. В джобах, которые надобно было так часто запускать прописали вызов этой процедуры, с требуемым кодом (обычно - запуск какой-либо другой процедуры, которая должна так часто "молотить"). Эти джобы выполняются по расписанию, обычно с ежеминутным интервалом, получается, что когда "внутри" джоба срабатывает описанная процедура, т.е. наступило время попадающее в "рабочий интервал", то джоб непрерывно висит работающим до окончания этого периода.Итого, получилось около 15-20 джобов работающих по такой схеме. И тут возникла проблема...SQL Agent через какое-то время работы (день-два) сообщает ошибку:
[<b>165</b>] ODBC Error: <b>0</b>, Memory allocation failure [SQLSTATE HY001] (ConnExecuteCachableOp)
А потом, еще минут через 15-20 после, идут уже валом сообщения такие:
[<b>380</b>] Unable to start JobManager thread for job <Job_Name>
Всего джобов на инстансе приличное кол-во - около 180 шт. Подозрение падает на эти цикличные джобы, т.к. ошибки стали возникать примерно тогда, когда все требуемые задания были переведены на этот механизм. Но прямой зависимости нет, что включили "циклический" джоб - сразу ошибка. Ошибка появляется не сразу... Лечится перезапуском SQL Agent-а.Есть вопросы к аудитории:1) где можно почитать инфу про механизм подключения SQL Agent-а к SQL Server-у при запуске джоба? про это самое ODBC...2) у кого есть какие идеи на счет реализации часто работающих джобов/процедур? постоянно работающих (запуск-исполнение-снова запуск)?
8 ответов

Deniro

Запустить джоб один раз и пускай в нем процедура с бесконечным циклом решает сама, с какой периодичностью выполнять действияХотя такой подход, по-моему, похож на какую-то систему оповещения.Просто вы не можете поймать событие и проверяете его каждые 1-10 секунд ?


Deniro

Запустить джоб один раз и пускай в нем процедура с бесконечным циклом решает сама, с какой периодичностью выполнять действияТак это, собственно, и реализованно. Чуть по разному это вообще можно сделать... У нас джоб и запускается, просто во всех таких джобах - одна единая процедура запуска, с параметром, в котором указано какую конкретно процедуру "крутить" в пределах "рабочего интервала".Все отлично, только память стала заканчиваться периодически у Агента.


Deniro

Запустить джоб один раз и пускай в нем процедура с бесконечным циклом решает сама, с какой периодичностью выполнять действияТак это, собственно, и реализованно.
А это тогда что "эти джобы выполняются по расписанию, обычно с ежеминутным интервалом," ?


Deniro

А это тогда что "эти джобы выполняются по расписанию, обычно с ежеминутным интервалом," ?
Это дополнительная подпорка в наших "цикличных" джобах. Т.е. в них не разовый запуск, а ежеминутный - на случай, если исполняемая процедура обломается, чтобы перезапустилась в течении минуты заново.


Deniro

Хотя такой подход, по-моему, похож на какую-то систему оповещения.Просто вы не можете поймать событие и проверяете его каждые 1-10 секунд ?
Это не только оповещения могут быть, а например, интеграция с системой с которой обмен возможен только посредством файла - смотреть новые данные в файле и их забирать, также обнаружение какой-либо информации и реакция на эту информацию... - да много всяких задач может быть. Где заведомо не возможно поймать определенное событие, а реагировать на него надо и для юзеров желательно "мгновенно".


Deniro

Deniro,Пишите свою службу, и реальзуйте в ней все это, тогда отпадет проблема непонятных ошибок.Это самый лучший выход из ситуации.


Deniro

WarAnt,а в случае с агентом, попробуйте поставить SET NOCOUNT ON в ваших процедурах, раз они выполяются по безконечному циклу то как вариант переполняется буфер сообщений сервера.


Deniro

WarAnt,а в случае с агентом, попробуйте поставить SET NOCOUNT ON в ваших процедурах, раз они выполяются по безконечному циклу то как вариант переполняется буфер сообщений сервера.
Это понятно - это у нас в каждой процедуре стоит "по умолчанию".