Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.23;
Скачать: CL | DM;

Вниз

Работаю с DOA Отвалилается база ОРАКЛ. Как заранее узнать о этом?   Найти похожие ветки 

 
maxi ©   (2002-08-29 16:30) [0]

Тема такая : я работаю с базой ORACLE через компоненты DOA. Иногда база отваливается - и есть возможномсть переключиться на резервную базу - точно такую же по параметрам. Единственное - как заранее (до того как сдлать запрос или вызвать процедуру с базы)отловить, что база рухнула? У меня около 40 компонентов ДОА используется в программе, и писать для каждого Try...except - неохота да и муторно это... Есть соображения ?


 
maxi ©   (2002-08-29 16:52) [1]

Ни кто не знает что ли ?


 
Юрий Жуков ©   (2002-08-29 17:33) [2]

Знает, но молчит :)
Вот пример обработчика ошибок приложения:

// ошибки Oracle
if E.ClassName = "EOracleError" then begin
case EOracleError(E).ErrorCode of
03114,12571 //Нет соединения с Oracle
,01041 //внутренняя ошибка. hostdef расширение не существует
,03113 //принят сигнал конца файла по коммуникационному каналу
: begin
dmMain.oss.LogOff;
S:="Нет соединения с Oracle"+#10+#13;
MessageDlg(S+"Необходимо перегрузить программу", mtError, [mbOK], 0);
Application.Terminate;
end;
00028 : //Ваш сеанс удален
begin
dmMain.oss.Logoff;
S:="Ваш сеанс удален"+#10+#13;
MessageDlg(S+"Необходимо перегрузить программу", mtError, [mbOK], 0);
Application.Terminate;
end;
01089 :
begin
dmMain.oss.Logoff;
S:="Срочное погружение..."+#10+#13+EOracleError(E).Message;
MessageDlg(S+"Необходимо перегрузить программу", mtError, [mbOK], 0);
Application.Terminate;
end;
01012 : //Вы не не вошли в систему
begin
dmMain.oss.Logoff;
S:="Вы не не вошли в систему"+#10+#13;
MessageDlg(S+"Необходимо перегрузить программу", mtError, [mbOK], 0);
Application.Terminate;
end;
end;// case

end;//ORacle Errors


 
maxi ©   (2002-08-30 09:34) [3]

Всё это конечно хорошо, однако как поймать само событие отключения (отваливания) базы ????????? :о), прежде чем выяснять что за ошибка ... :о)
Делать таймер и каждую секунду выполнять запрос (с try .. except конечно) с целью выяснения работает база или нет - мне кажется маразм полнейший, ведь придется дергать базу каждую секунду.
Было бы лучше, если бы была возможность обрабатывать события на отключение. По идее, это должно делать событие OnChange в компоненте TOracleSession - однако, как показала практика - нифига оно не срабатывает когда отключается база, или отваливается сетка ....
Есть обходной путь - DOA компоненты ведут лог-файл с ошибками. Однако, там пишутся помоему все ошибки и выцеплять их довольно трудно (каждая запись ошибки имеет своё число строк). В этом логе, к счастью или нет, моментально фиксируется падение(отключение) базы или сетки. Т.е. сами DOA компоненты для себя пометочку делают, что связь с базой разорвана, однако пользователям то её как выцепить ?
Жду предложений ... За справку по номерам ошибок - большое спасибо.


 
maxi ©   (2002-08-30 12:11) [4]

Взываю о помощи ....


 
Black Cat ©   (2002-08-30 12:53) [5]

На скорую руку, может поможет OracleEvent? У меня по крайней мере в момент дисконнекта отрабатывается его OnError, но особо не копал в этом направлении и сессию руками убивал.


 
maxi ©   (2002-08-30 13:15) [6]

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


 
Black Cat ©   (2002-08-30 13:41) [7]


> maxi

Еще бы кувалдой ее ;-)

а это (мне трудно судить, я ODAC использую, а DOA для общего развития):

TOracleSession.CheckConnection

Declaration

function CheckConnection(Reconnect: Boolean): TCheckConnectionResult;

type TCheckConnectionResult = (ccOK, ccError, ccReconnected);

Description

When the server machine has gone down, the database has been shutdown, the network has had a problem, or the database session has been killed, you may end up with a TOracleSession that does not have a working connection with the database anymore. To check if this is the case, and to possibly reconnect the session, you can use the CheckConnection function. The result can have one of the following values:

ccOK The connection is still okay.
ccError There is an error with the connection.
ccReconnected There was an error with the connection, but it has been successfully re-established.

Use the Reconnect parameter to indicate if the function should attempt to re-establish the connection in case of an error. Note that all TOracleDataSet and TOracleQuery components will be closed after re-establishing a connection, so some additional actions will probably be required to handle this situation.


 
MW ©   (2002-08-30 14:18) [8]

А в ODAC есть какое-то событие на эту тему?


 
Юрий Жуков ©   (2002-08-30 14:46) [9]

2maxi
Этот пример вешать на обработку ошибок приложения!
Кладешь компонент на форму под название TApplicaationEvent (Кажется так называется)
И далее кладешь туда обработчик на onException.
Елси у тебя теряется связь с базой, то DOA генерит исключение - где ты имешь код ошибки - далее что нужно, то и делаешь.

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



 
Black Cat ©   (2002-08-30 15:00) [10]


> MW

В Одаке нет


> Юрий Жуков

Автору нужно знать ДО ВЫПОЛНЕНИЯ (до выдергивания сетевого разъема ;-) )какого-либо запроса состояние коннекта.

Обработчик ошибок, конечно,наиболее рациональное решение. В противном случае нужно перед каждым нырянием к БД проверять состояние подключения (CheckConnection). Про лог-файл тоже не слышал.


 
Юрий Жуков ©   (2002-08-30 15:57) [11]

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


 
malakai ©   (2002-08-30 16:41) [12]

Сам не пробовал но читал:
можно решить используя механизм Connection Load Balancing - процес равномернового распределения нагрузки по чиcлу соединений:
Запрашивющий соеденение клиент случайно выбирает процес прослушиания из списка процесов службы которая указана в tnsnames.ora. Если выбраный процес недоступен то запрос на соединение может быть аврийно переключен на другой.
вот пример настройки tnsnames.ora:
TST8 = (DESCRIPTION=
(FAILOVER=on)
(LOAD_BALANCE=on)
(ADDRESS = (PROTOCOL=tcp)
(HOST=host1)
(PORT=1521))
(ADDRESS = (PROTOCOL=tcp)
(HOST=host2)
(PORT=1521))
(ADDRESS = (PROTOCOL=tcp)
(HOST=host3)
(PORT=1521))

(CONNECT_DATA=(SERVICE_NAME=sales))
)

На самом деле Connection Load Balancing это более сложная вещь чем просто перебирание процесов прослушивания на клиенте. Все это можно найти в документации.
Удачи.



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

Текущий архив: 2002.09.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
1-73727
Dasha
2002-09-11 13:53
2002.09.23
MDI Форма


1-73722
Rule
2002-09-11 10:11
2002.09.23
Помогите


14-73853
michael_b
2002-08-27 21:43
2002.09.23
Посоветуйте программу для взлома файлов защищенных средствами MS


6-73794
SuN_Alex
2002-07-20 03:59
2002.09.23
Как подключится к IP IPC$ ?


1-73592
bs
2002-09-12 09:00
2002.09.23
Как соединить два элемента из двух разных ListBox-ов линией