Форум: "Базы";
Текущий архив: 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.48 MB
Время: 0.042 c