sqlldr иногда не выходит из системы, несмотря на завершение журнала - PullRequest
0 голосов
/ 11 ноября 2019

Мы вызываем инструмент массового импорта Oracle sqlldr в коде C ++. Мы делаем это путем создания процесса Windows после создания элементов управления, данных и файлов журналов (см. Ниже).

Большую часть времени процесс завершается быстро, и WaitForSingleObject возвращает WAIT_OBJECT_0.

Однако нав некоторых случаях WaitForSingleObject возвращает WAIT_TIMEOUT, указывая, что sqlldr не завершился.

Файлы данных, используемые при превышении времени ожидания процесса, не превышают нормальное значение.

По истечении времени ожидания файл журнала показывает ожидаемоестроки результатов успеха и об ошибках не сообщается.

Наш код убивает процесс после истечения времени ожидания, поэтому мы не можем подтвердить, что sqlldr все еще активен в диспетчере задач, когда истекает время ожидания.

Обычнопоследующий вызов sqlldr через тот же механизм завершается, как и ожидалось, в короткие минуты, и процесс завершается, как и ожидалось.

Кто-нибудь может подсказать, почему иногда не удается завершить работу sqlldr, по крайней мере, в том, что касается процесса Windows?

STARTUPINFO start_info;
memset((void *) &start_info, 0, sizeof(STARTUPINFO));
start_info.cb = sizeof(STARTUPINFO);
start_info.dwFlags = STARTF_USESHOWWINDOW;
start_info.wShowWindow = SW_HIDE;

PROCESS_INFORMATION proc_info;
memset((void *) &proc_info, 0, sizeof(PROCESS_INFORMATION));

CreateProcess(
NULL,
"sqlldr USERID=<user>/<pwd>@<server> CONTROL=<control file> LOG=<log file>",
NULL,
NULL,
FALSE,
CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED,
NULL,
<data file>,
&start_info,
&proc_info);

ResumeThread(proc_info.hThread);

DWORD dwExit = WaitForSingleObject(proc_info.hProcess,<30 minute timeout value>);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...