![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как на "клиенте" максимально быстро отловить крах SQL [D5, MSSQL]
_Сергей_ © (2004-09-06 11:36:00)Здравствуйте!
Имеется задача: непрерывное производство, данные должны отправляться на MSSQL каждые 10 сек. При крахе SQL сервера (самого сервера, сетевого оборудования и т.д.) надо переключиться на резервный, при восстановлении - обратно. Время обнаружения обоих ситуаций критично (желательно не должно превышать 1-1.5 сек).
Для клиента эти переключения должны проходить без сообщений об ошибке.
Посоветуйте чайнику как это лучше реализовать. Пробовал MSConnection и ADOConnection - пока не очень получается.
Arm79 (2004-09-06 23:54:00) [1]разместить на каждом из серверов БД доп. приложение, исполняющее SQL запросы (экзекутер). Каждое их этих приложений должно оповещать "родительское" о результате и/или своем функционировании. А у "родительского" в отдельном треде должна выполняться прослушка таких сообщений. проходит с 1-го, хорошо, не приходит - пишем на второй. и тд.
Ega23 (2004-09-06 16:22:00) [2]Трёхзвенка?
сергей1 (2004-09-06 15:24:00) [3]так насколько я понял, у него время очень критично. То, что на сервер не удалось записать выясняется только через несколько секунд, а надо быстрее
Рамиль (2004-09-06 15:11:00) [4]А чем не нравится вариант с буфером все таки? Пишешь в очередь, как только записать на сервер не удается, пишешь на другой, переодически проверяя при этом "старый". Или критична и дальнейшая обработка данных?
сергей1 (2004-09-06 14:16:00) [5]хотя насчет 8 сек. задержки из-за самой винды я малость погнал, около 3 выходит, протестил сейчас одно наше сетевое приложение (не имеющее отношение к БД), да и вообще - когда кабель выдергиваешь, окошко о разрыве связи как-раз через это время всплывает
сергей1 (2004-09-06 14:02:00) [6]там есть какой-то general timeout, он в 0 установлен.
Вот сейчас проверил, посылал в событии таймера запрос на сервак каждые 0.5 сек. - потом оторвал сетевой хвост - ошибка вылезла секунд через 10
Карелин Артем (2004-09-06 13:32:00) [7]В конструкторе строки подключения такой параметр есть вроде бы...
Ega23 (2004-09-06 13:23:00) [8]30 сек. Timeout, если мне память не изменяет. Но, вроде, можно эту цифру поменять.
Sergey13 (2004-09-06 13:22:00) [9]2[7] сергей1 (06.09.04 13:13)
>винда определяет разрыв связи действительно долго, поэтому отсылка мелких запросов не поможет, все выльется в те-же 8 сек.
Как мерял? Что то сомнительно. За МС не скажу, щас попробовал на Оракле сервер погасил, так запрос сразу отвалился с ошибкой.
сергей1 (2004-09-06 13:13:00) [10]винда определяет разрыв связи действительно долго, поэтому отсылка мелких запросов не поможет, все выльется в те-же 8 сек. Возможно, надо создать мелкое приложение, отсылающее маленький пакет размером в байтик с сервера на клиента каждые пол секунды, а клиент ловит этот пакет. Как только пакет не пришел в назначенное время - связи нет. Разрыв определяется почти мгновенно (можно слать пакеты через 0.1 сек. например). Это решит проблему разрыва. А теперь если заставить это мелкое приложение выполнять мелкий запрос на самом сервере, и в зависимости от результата посылать или не посылать байтик - решиться проблема неисправности самого MSSQL, а не только физической связи
MOA (2004-09-06 13:05:00) [11]Вариант рекомендуемый при таких требованиях - кластер.
Ещё вариант - попробуйте воспользоваться MSQM (возможно, и DTC) + Alert от SQL. Сам не пользовался, но IMHO - это похоже на то, что Вам нужно. Эффект - запросы на запись будут задерживаться в очереди, если SQL сервер не доступен. По алертам - оператор перезапускает сервер.
Удачи!
Ega23 (2004-09-06 12:40:00) [12]Пингуй сервер в отдельном потоке. В случае краха - переключайся на резервный. Но, ИМХО, за 1-1.5 сек. - нереально.
Рамиль (2004-09-06 12:34:00) [13]
> При обрыве сети, например, except происходит через
> 5-10 сек, а факт восстановления приходится проверять
> при каждой транзакции. Явный "вылет" по времени.
Сделать локальный буфер для данных.
Sergey13 (2004-09-06 12:19:00) [14]По таймеру запускай простенький запросик (например текущую дату возвратить) и его уже в try except.
_Сергей_ (2004-09-06 11:48:00) [15]К сожалению, не годится. При обрыве сети, например, except происходит через 5-10 сек, а факт восстановления приходится проверять при каждой транзакции. Явный "вылет" по времени.
Карелин Артем (2004-09-06 11:40:00) [16]Ну как?
Заключить действия в try except для обнаружения факта ошибки.
Заготовить по одной строке подключения на каждый сервер или по экземпляру ADOConnection.
При обибке менять значит строку подключения или компонент доступа.