Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как восстановить связь с базой? [D7]


Andrushk ©   (2004-10-18 17:05:00) 

Есть Оракловая база, есть оракловый клиент. Временами связь рвется и при попытке клиента сделать какую-либо операцию с базой возникает ошибка типа: TNS packet writer failture.
Хотелось бы, чтобы при отсутствии связи выскакивало предупреждение, что был мол глюк, но можно попробовать переконнектиться, ну и если успешно переконнектились - пропихнуть данные. Никто так не делал? Или может статьи какие видел?
Использую DBExpress.


Andrushk   (2004-10-19 16:14:00) [1]

2 roottim [14]

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


roottim   (2004-10-19 15:31:00) [2]

>было бы интересно посмотреть на реально работающий пример...
дык кто мешает тебе попробовать...
ЗЫЖ мир познается методом научного тыка!


Andrushk   (2004-10-19 15:02:00) [3]

На какое событие у  TSQLConnection->TSQLDataSet->TDataSetProvider->TClientDataSet можно прицепиться чтобы отловить потерю связи???


Andrushk   (2004-10-19 14:27:00) [4]

2 Sergey13[10]
Вот раз с точки Oracle всеравно - надо сделать как удобнее пользователям.:-)
Насчет гридов - само собой не встанет, могу объяснить, но помоему это уход от темы!
Короче, как ни крути, если приложение перезапускать, то времени гораздо больше уходит.

2 roottim [11]
это все понятно:-)было бы интересно посмотреть на реально работающий пример...


roottim   (2004-10-19 12:07:00) [5]

> А по поводу транзакции я вообще не понял, как сохранить сессию, если ты приложение перезапускаешь?
Ты сессию и так и так теряеш...
а по всему остальному.. разданные лежат на клинте и при попытке пропехнуть пакет возник обрыв
1 явно: транзакция твоя откатилась..
2 неявно: то что лежало в кэше cds неизвестно в каком состоянии после частичной загрузки
3 кинь батон (вкл/выкл)... разорви связь.. сделай насколько изменений... примени... соедини обратно.. и снова принять.
о результате интерсно знать :).. правда трудно смоделировать 2 но всеравно.


Sergey13   (2004-10-19 12:00:00) [6]

2[8] Andrushk   (19.10.04 11:29)
>Это все общие слова про некий буфер,который при заполнении отсылается на сервер и коммитится.
Почему общие слова? Я делал такое. Очень просто - пишем в RxMemoryData и после подтверждения гоним на сервер. Заполняться может хоть целый день, а запись секунда.
Но я не настаиваю. Как хочешь так и делай.

2[9] Andrushk   (19.10.04 11:33)
>Зачем вообще перезапускать клиента если можно просто переконнектиться?
А какая разница. С точки зрения Оракла - никакой.

>А если у тебя куча связанных гридов??? У каждого запоминать позицию на которой стоял курсор???
Так если они "связаны", то я предполагаю, что выбрав в "головном" все остальное встанет как надо само собой.

>как сохранить сессию, если ты приложение перезапускаешь?
А как ее сохранить, если ты перелогиниваешься?


Andrushk   (2004-10-19 11:33:00) [7]

2 Draught
Зачем вообще перезапускать клиента если можно просто переконнектиться????
А если у тебя куча связанных гридов??? У каждого запоминать позицию на которой стоял курсор??? А потом еще ждать пока все формы откроются...пока снова все запросы отработают...
А по поводу транзакции я вообще не понял, как сохранить сессию, если ты приложение перезапускаешь?


Andrushk   (2004-10-19 11:29:00) [8]

Это все общие слова про некий буфер,который при заполнении отсылается на сервер и коммитится. Есть документ, его создание включает изменение многих таблиц и это должна быть одна транзакция.
Теперь мои общие слова. Мне надо написаь универсальный механизм, видимо представленный обработчиками для компонентов TSQLConnection->TSQLDataSet->TDataSetProvider->TClientDataSet, который будет перед ApplyUpdates запоминать состояние всех сохраняемых ClientDataSet-ов, а в случае возниконовения ошибки возвращять все эти ClientDataSet-ы в исходное состояние (то что было перед ApplyUpdates) и давать возможность пользователю изменить данные, отменить все и поппытаться еще раз передать данные на сервер.


Draught   (2004-10-19 11:20:00) [9]

ТРАНЗАКЦИИ и перезапуск клиента, связь оборвалась, можно сохранить текущее состояние у клиента (куча открытых окон) и перезапустить приложение. А транзакция не даст потеряться каким-либо данным...


Sergey13   (2004-10-19 10:41:00) [10]

2[5] Andrushk   (19.10.04 10:04)
Ну хорошо. Допустим для "коротких сбоев" ты решишь проблему (в чем я сомневаюсь). А для "длинных"? Уж если юзер что-то долго вводит, то может сохранять этот ввод в некий буфер на клиенте, а при заполнении, короткой транзакцией отправлять на сервер? При комите буфер очищать, при ошибке сохранять в файл и при новом запуске проги предлагать продолжить. ИМХО это решение универсальнее.


Andrushk   (2004-10-19 10:04:00) [11]

Смысл такой: Программа должна быть удобной:-)
Пользователь залогинился, наоткрывал кучу окон, ввел какие-то данные, и вдруг раз...сбой - все сначала? Тем более что отсутствие связи - случай редкий, просто бываю короткие сбои. В любом случае, если данные уже введены, я лучше несколько раз ткну кнопку "Протолкнуть", чем закрывать программу, несколько раз пробовать залогиниться, а потом быстро-быстро заново набивать данные пока есть связь.


Sergey13   (2004-10-19 09:26:00) [12]

А какой глобальный смысл во всем этом? Если связьоборвалась, то не факт, что через секунду она восстановилась. Скорее даже наоборот. И что? Будешь долбить логоном до восстановления? А смысл? Не проще прогу перезапустить?


Andrushk   (2004-10-19 09:05:00) [13]

Ну может тогда кто-нибудь  подскажет какую-нибудь статью или сайт, посвященный работе с базами???


Andrushk   (2004-10-18 17:28:00) [14]

А на какое событие лучше ловить?
И по поводу пропихнуть...
Если скажем ошибка была при попытке сделать SELECT, то надо это как то просечь и просто переоткрыть набор данных.
А вот если был UPDATE или INSERT... скажем я внес изменения в набор данных, делаю ApplyUpdates, несколько записей прошли и связь порвалась....т.е. после восстановления надо передать все сначала.
Тут вообще вопрос интересный и пока на мой взгляд малоописанный, ведь ClientDataSet хранит все сделанные изменения а на ApplyUpdates передает их DataSet-у, т.е. можно было бы сохранить состояние ClientDataSet-а и в случае ошибки восстанавливать и пытаться передать еще раз. Это теория:-)) а вот как это сделать?


Sergey13   (2004-10-18 17:16:00) [15]

Хм. Восстановить старую сессию вроде не получится.

>ошибка типа: TNS packet writer failture
Ну дык лови ее и сделай переконнект.

>ну и если успешно переконнектились - пропихнуть данные
Т.е. допихать то, что не успел? ИМХО, не выйдет так.


Наверх

Титульная страница Поиск, карта сайта Написать письмо