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

Вниз

Правильное отключение (AdoConnection)   Найти похожие ветки 

 
Stanislav ©   (2006-11-07 17:10) [0]

Мне нужно чтобы мое приложение выполнило запрос к серверу и отключилось. делаю так:
AdoDataSet.open;
...
AdoDataSet.close;
AdoConnection.Close
Но процесс на сервере все еще остается.
Как сделать чтобы он сразу отключался?


 
sniknik ©   (2006-11-07 17:18) [1]

> AdoDataSet.close;
лишнее в этом, показанном, случае.

> Как сделать чтобы он сразу отключался?
никак, это мера против частого пересоздания обьектов, также и память не сразу отдается, и com обьекты спустя таймаут какойто уничтожаются, и т.д. любое действие с ресурсоемкими вещами...
а вдруг кто запросит, а оно уже есть...


 
Stanislav ©   (2006-11-07 17:26) [2]

ясно спасибо.


 
Stanislav ©   (2006-11-07 17:34) [3]

Вопрос вот в чем
Я по таймеру (1 раз в 3 мин) обновляю данные в таблице (это монитор руководителя).
Хотелось бы чтобы при обрыве сети и последующим ее востановлении, монитор подключался к базе и работал дальше, даже если во время обрыва сети были неуспешные попытки подключиится.
А в таком случае получается что после неудачного подключения подключится к базе уже невозможно.
Есть выход пересоздавать Connection.
Но может есть другие предложения?


 
Плохиш ©   (2006-11-07 19:00) [4]


> А в таком случае получается что после неудачного подключения
> подключится к базе уже невозможно.

Надо найти причину невозможности в твоей программе и устранить её.


 
MsGuns ©   (2006-11-07 20:10) [5]

>sniknik ©   (07.11.06 17:18) [1]
>лишнее в этом, показанном, случае.

Нет, не лишнее

>> Как сделать чтобы он сразу отключался?
>никак, это мера против частого пересоздания обьектов, также и память не сразу отдается, и com обьекты спустя таймаут какойто уничтожаются, и т.д. любое действие с ресурсоемкими вещами...

Не совсем верно. "Повлиять" все же можно. По крайней мере попытаться ;))


 
sniknik ©   (2006-11-07 20:59) [6]

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

> Не совсем верно. "Повлиять" все же можно. По крайней мере попытаться ;))
особенно приятно будет поизвращатся, именно сейчас, когда выяснили что причина/подоплека вопроса вовсе не в незакрытии коннекта сервером. и смысла рушить систему 0.
ага, и очень весело.

p.s. чем заниматься буквоедством, лучше бы обьяснил человеку его проблему. раз уж делать нечего, и тянет поговорить.


 
MsGuns ©   (2006-11-07 21:39) [7]

>sniknik ©   (07.11.06 20:59) [6]
>с чего бы это? коннект все одно все  свое закроет, а его закрытие командой следом идет. если же намек на важный порядок изза какихто обработчиков, еще чего, то в данном конкретном, показаном (что упоминалось) случае датасет один.

Коннект коннекту рознь. Многое зависит от его опций.

>особенно приятно будет поизвращатся, именно сейчас, когда выяснили что причина/подоплека вопроса вовсе не в незакрытии коннекта сервером. и смысла рушить систему 0.

Если бы это сообщение было не от тебя, я вы не вылазил. "Кесарю-кесарево", в т.ч. и повышенная ответсвенность за слова.

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

Из приведенного "кода" я не могу делать никаких выводов. Это все равно, что позвонить в скорую и сказать "попа болит"


 
Anatoly Podgoretsky ©   (2006-11-08 00:09) [8]

> MsGuns  (07.11.2006 21:39:07)  [7]

> Это все равно, что позвонить в скорую и сказать "попа болит"

Завяжи и лежи


 
ЮЮ ©   (2006-11-08 07:14) [9]


> Есть выход пересоздавать Connection.

Достаточно переоткрыть ADOConnection.


 
ЮЮ ©   (2006-11-08 07:54) [10]

у тебя до закрытия битого коннект просто дело не доходит:

AdoConnection.Open;
try
 AdoDataSet.open;
 ...
 AdoDataSet.close;
finally
 AdoConnection.Close;
end;


 
Stanislav ©   (2006-11-08 08:46) [11]

ЮЮ ©   (08.11.06 07:54) [10]
Правильно, сейчас попробую.

Хотя на самом деле код сложнее, на DataSet1.AfterOpen запускается доп. поток с перебором всех записей в датасете, и в нем закрывается Connection, но дополнительно я написал закрытие Коннекта перед открытием датасета на OnTimer.

AdoDataSet1.Close;
ADOConnection1.Connected:=false;
try
AdoDataset.Open;
except
ShowMessage("Сбой подключения")
end;


 
Stanislav ©   (2006-11-08 09:05) [12]

Все равно не получается, в таком варианте:

AdoDataSet1.Close;
ADOConnection1.Connected:=false;
try
AdoDataset1.Open;
except
AdoConnection1.Close;
ShowMessage("Сбой подключения")
end;


 
Anatoly Podgoretsky ©   (2006-11-08 09:27) [13]

> Stanislav  (08.11.2006 09:05:12)  [12]


AdoDataSet1.Close;         <- зачем это
ADOConnection1.Connected:=false;
try
AdoDataset1.Open;       <- зачем это, может стоит все таки сначала открыть соендинение
except
AdoConnection1.Close;        <- и особенно зачем это, оно и так закрыто
ShowMessage("Сбой подключения")
end;


Это не код, а черт знает что, логика в нем отсутствует


 
Anatoly Podgoretsky ©   (2006-11-08 09:28) [14]

> Stanislav  (08.11.2006 08:46:11)  [11]

Опять же, попытка открытия набора при закрытом соединение

> ADOConnection1.Connected:=false;
> try
>   AdoDataset.Open;


 
Anatoly Podgoretsky ©   (2006-11-08 09:29) [15]

> ЮЮ  (08.11.2006 07:54:10)  [10]

> у тебя до закрытия битого коннект просто дело не доходит:

У него до открытия не только битого, но и не битового дело не доходит


 
ЮЮ ©   (2006-11-08 09:33) [16]


> Хотя на самом деле код сложнее, на DataSet1.AfterOpen запускается
> доп. поток с перебором всех записей в датасете, и в нем
> закрывается Connection, но дополнительно я написал закрытие
> Коннекта перед открытием датасета на OnTimer.


Да уж.
Может коннект вообще не трогать? Переоткрывать только по необходимости - при сбое открытия запроса. А доп. поток зачем? В основном то что в этот момент можно делать, если к коннекту и приказаться нельзя?


 
Stanislav ©   (2006-11-08 10:27) [17]

Anatoly Podgoretsky ©   (08.11.06 09:28) [14]
Он автоматически открывается. С этим проблем нет.


 
Stanislav ©   (2006-11-08 10:35) [18]

ЮЮ ©   (08.11.06 09:33) [16]
Доп. поток для того чтобы основная форма  не тормозила.


 
ЮЮ ©   (2006-11-08 10:39) [19]

А что на той форме такого в этот момент есть, если DataDet сканируется в допюпотоке. На основной форме, небось, он же в DBGride показывается?
А без сканирования обойтись нельзя? - получить всё нужное одним (быстрым) запросом - ведь MS SQL всё-таки.


 
Stanislav ©   (2006-11-08 10:52) [20]

Грида нет. Есть объекты с лампочками (картинки из Imagelist), лампочка может быть либо красной либо зеленой, в зависимости от состояния (true/false), а также у каждого объекта есть значение keyvalue. А запросом запрашивается список ключей и состояний, которые нужно записать в объекты. Запись происходит в цикле, после чего запрос закрывается.
На главной форме ничего не происходит, доп. поток для того чтобы форму можно было нормально передвигать. В доп. потоке все нормально.


 
ЮЮ ©   (2006-11-08 11:17) [21]

И все-таки, я бы не стал рвать/устанавливать соединение каждые три минуты, а делал бы это тольк в случае невозможности открытия запроса - т.е. реальных проблемах с соединением. Лампочки при этом бы гасли. Зажигалась alarm-мигалка и сирена.


 
Stanislav ©   (2006-11-08 11:27) [22]

т.е. вот так, и в доп. потоке тоже убрать отключение.
AdoDataSet1.Close;
//ADOConnection1.Connected:=false;
try
AdoDataset1.Open;
except
AdoConnection1.Close;
ShowMessage("Сбой подключения")
end;
Но это все равно не решит роблему.


 
ЮЮ ©   (2006-11-08 11:34) [23]

connected := false;
attempts := 0;
repeat
 try
   Inc(attempts);
   AdoDataset1.Open;
   connected := true;
 except
   AdoConnection1.Close;
   AdoConnection1.Open;
 end;
until connected or (attempts > 10);

А тут уж смотри, что доллжна делать программа, если не удается установить связь с сервером. Или повторить это же по таймеру через некоторое время или ShowMessage("Сбой подключения") показать. Какая разница?


 
Stanislav ©   (2006-11-08 11:46) [24]

ЮЮ ©   (08.11.06 11:34) [23]
В этом примере он делает 10 попыток подключения.
Но вопрос в том что после неудачного подключения конекшин уже подключение не восстановит. Хоть переоткрывай его хоть что.


 
Anatoly Podgoretsky ©   (2006-11-08 12:23) [25]

> ЮЮ  (08.11.2006 10:39:19)  [19]

Какой еще dbgrid для DbExpress и к тому же там просто нет места для торможения, для того это и было придумано. Облегченный однонаправленый доступ без курсора.


 
Stanislav ©   (2006-11-08 13:40) [26]

Использую ADO, почему DBEXPRESS, тип Курсора fowardonly.


 
Anatoly Podgoretsky ©   (2006-11-08 14:18) [27]


> Использую ADO, почему DBEXPRESS, тип Курсора fowardonly.

Прошу прощения, рядом идет паралельное аналогичное обсуждение, перепутал ветки.
Но если fowardonly то какой еще dbgrid так что ответ правильный, технология просто перепутана. Это для ЮЮ

fowardonly это однонаправленный курсор, а dbgrid требует двухнаправленного.
Это замечание к цитате

> он же в DBGride показывается?


 
ЮЮ ©   (2006-11-09 03:57) [28]


> Но вопрос в том что после неудачного подключения конекшин
> уже подключение не восстановит. Хоть переоткрывай его хоть
> что.


Это твое мнение. Мое прямо противоположное. Будто бы у меня коннект иногда не теряется? Тем не менее нажав на кнопочки "Разорвать связь" ADOConnection.Connected := False и  "Устаговить связь" ADOConnection.Connected := True, я получаю нормальное соединение.


 
Stanislav ©   (2006-11-09 08:41) [29]

ЮЮ ©   (09.11.06 03:57) [28]
Сегодня попробую, в течении дня напишу.


 
Anatoly Podgoretsky ©   (2006-11-09 09:01) [30]


> Это твое мнение. Мое прямо противоположное.

Иначе как бы тогда вообще могли работать программы, запуск программы приводит именно к переоткрытию. То есть работоспособность программы гарантируется только до первой потери соединения, зачем надо к автору обращаться за новой версией, эта уже отработала свое.


 
ЮЮ ©   (2006-11-09 09:23) [31]


> То есть работоспособность программы гарантируется только
> до первой потери соединения

Даже БДЕ восстатавливает соединение после потери, слегка ругнувшишь.  
Стыдно выдавать нечто, "гарантирующее работоспособность только до первой потери соединения" за программу :)


 
Stanislav ©   (2006-11-09 10:30) [32]

Простой пример.
Форма 3 кнопки.
1-я кнопка
AdoConnection.open;
2-я кнопка
AdoConnection.Close;
3-я кнопка
ADOConnection.free;
Запускаю приложение и Enterprise Manager
Нажимаю 1-ю кнопку, Обновляю в EM список процессов
-мой процесс появился
Нажимаю 2-ю кнопку, Обновляю в EM список процессов
-мой процесс остался
Нажимаю 3-ю кнопку, Обновляю в EM список процессов
-мой процесс пропал.
Получается что ADOCOnnection держит процесс даже, когда он закрыт (судя по словам Sniknik это продолжается некоторое время, только сколько?).
При обрыве сети сервер убивает процесс, после восстановления ADOConnaection пытается восстановить подключение с тем же процессом, но на сервере его нет и Connection выдает ошибку.



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

Форум: "Начинающим";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.069 c
2-1162898517
alucard
2006-11-07 14:21
2006.11.26
Подскадине где компонент SocketConnection?


2-1162813298
Need_Help
2006-11-06 14:41
2006.11.26
Dataset not in insert or edit mode...


1-1160395846
pasha_golub
2006-10-09 16:10
2006.11.26
deprecated directive


2-1162976746
cvg
2006-11-08 12:05
2006.11.26
Проблема с MySQL -- не читаются данные


6-1152182640
KLAUS
2006-07-06 14:44
2006.11.26
Ошибка в Webbrowser1





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский