Приветствую.
Ищу совета. Есть служба, которая периодически (раз в час), сливает данные в базу на удаленном SQL сервере. При остановке службы все несохраненные с прошлого часа данные также сохраняются. Проблема возникает при рестарте сервера. Я полагаю возможно из-за того, что все службы завершаются, в том числе те, которые нужны для установки удаленного соединения с базой. В общем при этом случается такая ошибка: [DBNETLIB][ConnectionOpen(SECCreateCredentials()).]SSL Security error.
Сохранение делаю в обработчике SERVICE_CONTROL_SHUTDOWN. Используется ADO. Нашел в msdn, что служба может получать еще событие SERVICE_CONTROL_PRESHUTDOWN, в котором типа можно делать подобные операции, пока система еще не начала shutdown. Но оно появилось только в Windows 2008/Vista, а нужно чтобы работало и на Windows 2003.
Конечно, можно сохранять куда-то локально, чтобы при следующем старте сохранить в базу, но это доп. работа, кот. хотелось бы пока избежать. Для 100% надежной системы это конечно было бы необходимо, но пока такой необходимости нет, хотелось бы, чтобы без лишних хлопот в большинстве случаев запись в базу проходила.
Может кто-то сталкивался с подобной задачей?
Re: Сохранение в удаленную базу при reboot/shutdown
Здравствуйте, joshua, Вы писали:
J>Приветствую. J>Ищу совета. Есть служба, которая периодически (раз в час), сливает данные в базу на удаленном SQL сервере. При остановке службы все несохраненные с прошлого часа данные также сохраняются. Проблема возникает при рестарте сервера. Я полагаю возможно из-за того, что все службы завершаются, в том числе те, которые нужны для установки удаленного соединения с базой. В общем при этом случается такая ошибка: [DBNETLIB][ConnectionOpen(SECCreateCredentials()).]SSL Security error. J>Сохранение делаю в обработчике SERVICE_CONTROL_SHUTDOWN. Используется ADO. Нашел в msdn, что служба может получать еще событие SERVICE_CONTROL_PRESHUTDOWN, в котором типа можно делать подобные операции, пока система еще не начала shutdown. Но оно появилось только в Windows 2008/Vista, а нужно чтобы работало и на Windows 2003. J>Конечно, можно сохранять куда-то локально, чтобы при следующем старте сохранить в базу, но это доп. работа, кот. хотелось бы пока избежать. Для 100% надежной системы это конечно было бы необходимо, но пока такой необходимости нет, хотелось бы, чтобы без лишних хлопот в большинстве случаев запись в базу проходила. J>Может кто-то сталкивался с подобной задачей?
Если вы считаете, что проблема возникает из-за того, что завершаются службы, необходимые для соединения с удаленной базой, то можно попробовать сделать вашу службу зависимой от этих служб, и она (ваша службы) по идее должна будет завершиться до завершения зависимых служб.
Сначала накидать в зависимые все службы, которые как вы считаете могут быть нужны, и если прокатит, потом постепенно методом исключения выявить службы, которые действительно необходимы.
Re[2]: Сохранение в удаленную базу при reboot/shutdown
Здравствуйте, Baskak, Вы писали:
B>Если вы считаете, что проблема возникает из-за того, что завершаются службы, необходимые для соединения с удаленной базой, то можно попробовать сделать вашу службу зависимой от этих служб, и она (ваша службы) по идее должна будет завершиться до завершения зависимых служб. B>Сначала накидать в зависимые все службы, которые как вы считаете могут быть нужны, и если прокатит, потом постепенно методом исключения выявить службы, которые действительно необходимы.
Не, это не прокатит. При shutdown зависимость служб не учитывается.
Re: Сохранение в удаленную базу при reboot/shutdown
Как часто бывает, сам спрашивал — сам отвечаю.
Нашел способ. С помощью SetConsoleCtrlHandler можно получать уведомление о shutdown через handler-функцию, причем оно приходит раньше SERVICE_CONTROL_SHUTDOWN. Мало того, пока из handler-функции не вернуться, службы не начнут завершаться, т.е. эти вызовы синхронизированы.
В общем, таким образом сохранение при shutdown проходит успешно, что собственно и требовалось.
Re[2]: Сохранение в удаленную базу при reboot/shutdown
Здравствуйте, joshua, Вы писали:
J>Как часто бывает, сам спрашивал — сам отвечаю. J>Нашел способ. С помощью SetConsoleCtrlHandler можно получать уведомление о shutdown через handler-функцию, причем оно приходит раньше SERVICE_CONTROL_SHUTDOWN. Мало того, пока из handler-функции не вернуться, службы не начнут завершаться, т.е. эти вызовы синхронизированы. J>В общем, таким образом сохранение при shutdown проходит успешно, что собственно и требовалось.
Поинтересуюсь, а вам нужно чтобы работало только на Windows XP/2003, или на Windows 2008/Vista тоже?
И сколько примерно длится операция сливания данных в базу SQL сервера?
На Windows7 например этот способ может не пройти (2008/Vista не проверял, но скорее всего аналогично), потому что там службы рубятся через определенное время, независимо от того, в какой функции находится управление в этот момент (даже в handler-функции, только что проверил).
Так что если нужна корректная работа на разных версиях Windows, обязательно протестируйте на Windows 2008/Vista/7.
Re[3]: Сохранение в удаленную базу при reboot/shutdown
Здравствуйте, Baskak, Вы писали:
B>Поинтересуюсь, а вам нужно чтобы работало только на Windows XP/2003, или на Windows 2008/Vista тоже? B>И сколько примерно длится операция сливания данных в базу SQL сервера?
B>На Windows7 например этот способ может не пройти (2008/Vista не проверял, но скорее всего аналогично), потому что там службы рубятся через определенное время, независимо от того, в какой функции находится управление в этот момент (даже в handler-функции, только что проверил).
B>Так что если нужна корректная работа на разных версиях Windows, обязательно протестируйте на Windows 2008/Vista/7.
Мне нужно на Win2000 и выше. Операция сохранения у меня быстрая, занимает не больше секунды. Мне важен был сам факт возможности сохранения — в SERVICE_CONTROL_SHUTDOWN уже было поздно, а в обработчике от SetConsoleCtrlHandler все проходит удачно. Вы говорите видимо о таймауте, который есть у службы при shutdown'е. Понятно, что не стоит проводить долгие операции при этом. У меня такой задачи и не было.