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

Вниз

Как восстановить связь с базой?   Найти похожие ветки 

 
Andrushk   (2004-10-18 17:05) [0]

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


 
Sergey13 ©   (2004-10-18 17:16) [1]

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

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

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


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

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


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

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


 
Sergey13 ©   (2004-10-19 09:26) [4]

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


 
Andrushk   (2004-10-19 10:04) [5]

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


 
Sergey13 ©   (2004-10-19 10:41) [6]

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


 
Draught ©   (2004-10-19 11:20) [7]

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


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

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


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

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


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

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

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

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

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


 
roottim ©   (2004-10-19 12:07) [11]

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


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

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

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


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

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


 
roottim ©   (2004-10-19 15:31) [14]

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


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

2 roottim [14]

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



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

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

Наверх





Память: 0.49 MB
Время: 0.035 c
1-1099910119
Megabyte
2004-11-08 13:35
2004.11.21
Как в проекте другую форму сделать главной?


14-1099575770
DelphiN!
2004-11-04 16:42
2004.11.21
Сокеты на винде тормозят


1-1100020304
FED
2004-11-09 20:11
2004.11.21
PaintBox........


1-1099408347
Agent[007]
2004-11-02 18:12
2004.11.21
Всем hi. Как задать property у класса и можно ли его задать у r


1-1099662166
g-l-u-k
2004-11-05 16:42
2004.11.21
Формулы в Memo





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