Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];

Вниз

проверка связи ADOConnection...   Найти похожие ветки 

 
zom   (2003-04-16 14:12) [0]

Ситуация:
в приложении есть один АдоКоннекшн, и через него много всяких Кверей и Таблиц обращаются к базе.
(база MSSQL 2000 sp3)
Этот коннекшн открывается один раз при создании главного окна и закрывается при завершении...

Вопрос:
- как в ходе работы проверять наличие связи с сервером?
т.е чтобы не вешать обработку ошибок на каждый вызов запросов (они там сотни раз в коде встречаются...) а регулярно (по таймеру) проверять связь с сервером.
Дело в том, что когда связь прерывается неожиданно (сеть пропала, сервер умер..), то свойство ADOConnection1.Connected остаётся истиной, а при попытке обращения к базе возникает Ексепшн (Connection failure) и попытки переконнектиться не происходит (т.е. после того как связь восстановлена ошибка всё равно появляется)
- как после восстанавливать связь после этого...?


 
stone   (2003-04-16 14:19) [1]

см. в справке TADOConnection -> Properties -> State


 
jocko   (2003-04-16 14:29) [2]

2 stone ©
От него никакого проку...


 
zom   (2003-04-16 14:37) [3]

stone ©
не помогает...
там всё равно только одно состояние stOpen - и оно остаётся если даже коннекшн файлур...


 
zom   (2003-04-16 15:00) [4]

у меня пока только одна идея...
по таймеру с некоторым интервалом вызывать некоторый простенький тестовый запрос и его обрабатывать на ошибку, если ошибок нет - пусть живуть, а иначе выдавать мессагу об ошибке а запрос - повторить связь, если пользователь грит повторить - Коннектион.Клоуз и Коннекшин.опен, и если ошибка повторяется - опять запрос... и т.д. а если узер грит не повторять - Закрываем прилагу (без бызы от неё никой пользы)
вот только как это будет работать...
проверить в реальных условиях - долго и юзеры обидятся...


 
Hedron   (2003-04-16 16:23) [5]

Однако, как на первый взгляд, проверили соединение по таймеру, неважно как, соединение есть. Сразу после этого вызывается запрос, а связи уже нет? Как тогда?

function CheckConnection(ConnStr: WideString): boolean;
var TmpADO: TADOConnection;
TmpADO := TADOConnection.Create(Self);
with TmpADO do
try
ConnectionString := ConnStr;
LoginPrompt := False;
try Open;
except
end;
finally
Result := Connected;
Close;
Free;
end;
end;


 
zom   (2003-04-16 16:50) [6]

2 Hedron:
Ну по хорошему надо каждое обращение к базе обрабатывать на ексепшн, и в зависимости от типа ошибки что-то делать...
это нудно и долго, а мне нет необходимости так делать, но знать кода связь отвалилась надо ходяб с задержккой в несколько секунд..
да и мало шансов, что коннект обломится за доли секунды...

а то что ты предложил вообще-то вполне вариант для проверки, НО:
1. это долго - создавать коннекшн каждый раз (каждую секунду например)
2. так ты проверяешь связь с сервером вообще, а возможно, что этот временный коннект сработает, а рабочий уже отвалился...
я вот как сделал (у меня работает а как будет в реале...)
procedure TFormCass.Timer1Timer(Sender: TObject);
label eee;
begin
if isTry then exit;
isTry:=true; // Это чтобы пока один таймер работает - другой не сработал
try
AQtest.Close;
Aqtest.Open;
except
eee:
if MessageBox(handle,"Связь с сервером потеряна. Повторить попытку?","НЕТ связи!",MB_YESNO )=idNo then
Application.Terminate
else
Begin
try
AdoConnection1.Close;
AdoConnection1.Open;
if not AdoConnection1.Connected then goto eee;
AQtest.Close;
Aqtest.Open;
AdoPlu.Open;
Adotmp.Open;
showmessage("Связь восстановлена!");
except
showmessage("Не удалось восстановить связь!");
istry:=false; //подождём до следующего раза...
end;
End;
end;

istry:=false;
end;


 
zom   (2003-04-17 09:47) [7]

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


 
NAlexey   (2003-04-17 09:58) [8]

Почему не интересно? Очень даже интересно.
Specifies whether the connection is active.

property Connected: Boolean;

Description

Set Connected to True to establish a connection to an ADO data store without opening a dataset. Set Connected to False to close a connection. The default value for Connected is False.

An application can check Connected to determine the current status of a connection. If Connected is True, the connection is active; if False, and the KeepConnection property is also False, then the connection is inactive.

Connected can also be used in a program to determine the success of a call to the Open method (a True value in Connected) or the Close method (a False value).

with ADOConnection1 do begin

Open;
if Connected then
{ connection successful }
else
{ connection unsuccessful };

end;

и ещё оттудаже
Specifies whether an application remains connected to a database even if no datasets are open.

property KeepConnection: Boolean;

Description

Use KeepConnection to specify whether an application remains connected to a database even if no associated dataset components are currently active. When KeepConnection is True (the default) the connection is maintained. For connections to remote database servers, or for applications that frequently open and close datasets, set KeepConnection to True to reduce network traffic, speed up applications, and avoid logging in to the server each time the connection is reestablished.

When KeepConnection is False a connection is dropped when there are no open datasets. Dropping a connection releases system resources allocated to the connection, but if a dataset is later opened that uses the database, the connection must be reestablished and initialized.


 
zom   (2003-04-17 12:53) [9]

2 NAlexey:
Это я давно уже прочитал, и тоже сначала поверил...
а потом проверил, так вот, если связь прерывается не из программы а нечаянно (например сервер остановили или продок сетевой выдернули...)
так вот - тогда Коннектед остается тру, и вообще состояние не меняется... я об этом уже писал.

кароче: в дельфи нет нормальных способов проверять и восстанавливать коннект, кроме того что я написал, а кипконнекшн стоит наоборот ставить в фалс, что бы при каждом новом запросе коннекшн заново открывался (как я и делаю в случае обрыва связи), только при нормальной работе это заметно замедлит выполнение запросов.


 
jocko   (2003-04-17 14:07) [10]

На счет не интересно: на моей памяти этот вопрос поднимался здесь несколько раз (один раз задавал его я)
резюме только одно - обрабатывать ошибку, например, в OnExecuteComplete. Я так делаю. Выглядит в принципе пристойно, (вообще я все ошибки оттуда показываю, а сами запросы в try).

Повторяющиеся запросы неудобно - засоряют трафик, и загружают сервер, хотя с другой стороны, если сервер выгружает долго спящие процессы то ваш не выгрузит...


 
zom   (2003-04-17 14:35) [11]

Да, наверно это правильнее, тока мне что-то не хотса ВСЕ запросы в try делать (точнее переделывать) дело в том что прилага вообще-то вполне отработанная и не глючила до сих пор, пока со связью проблемы не начались...
да и показывать ошибки мне ни к чему - юзеры совсем глупые - надо чтоб связь по возможности дольше держалась и быстрее восстанавливалась, е сли её нет, то пусть юзверь звонит админу и/или настырно давит "повторить попытку".
а про загрузку - в режиме нормальной работы загрузка раз в 1000 больше чем эти тестовые запросы, вот только иногда бывают длительные перерывы...

А то что эта тема тут обсуждалась я кнешно догадывался ;), но найтить не смог
вот еслиб этот вопрос в FAQ добавили...



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.012 c
14-23337
Sh2
2003-04-18 21:51
2003.05.08
Почему они смеялись?


3-22989
Andy Verinov
2003-04-17 00:09
2003.05.08
Вешается BDE от большого числа запросов?


6-23270
Григорий Ситнин
2003-03-04 16:17
2003.05.08
Мониторинг сети


4-23422
Silver_
2003-03-10 12:37
2003.05.08
Переделка одной клавиши в другую (Hook)


3-23004
На
2003-04-17 12:14
2003.05.08
Создание User и права доступа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский