Гость
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Восстановить соединение в Forms / 14 сообщений из 14, страница 1 из 1
26.06.2014, 15:38
    #38680972
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить соединение в Forms
Здравствуйте.
Приложение на Forms запущено постоянно и выполняет действия по таймеру (триггер WHEN-TIMER-EXPIRED ). Если происходит обрыв связи, то надо выйти из приложения и запустить снова. Если обрыв произошел ночью, то только утром происходит перезапуск. Хотят, чтобы коннект восстанавливался автоматически.
Проверка наличия коннекта к базе проходит нормально, но не получается LOGOUT и LOGON
триггер WHEN-TIMER-EXPIRED
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
DECLARE 	   
  timer_id TIMER;  
  do_log BOOLEAN;  
  n_date date;
  NOT_CONN EXCEPTION;
  PRAGMA EXCEPTION_INIT(NOT_CONN,-1089); 
  NOT_CONN1 EXCEPTION;
  PRAGMA EXCEPTION_INIT(NOT_CONN1,-3113);   
BEGIN
    UN := SUBSTR(Get_Application_Property(USERNAME),1,32); 
    PW := SUBSTR(Get_Application_Property(PASSWORD),1,32);
    PW1 := SUBSTR(Get_Application_Property(PASSWORD),1,32);
    CS := ltrim(rtrim(SUBSTR(Get_Application_Property(CONNECT_STRING),1,30)));
    IF cs IS NOT NULL THEN
      PW := PW||'@'||CS;
    END IF;  	
.....
      timer_id := FIND_TIMER ('LOAD_TIMER');
      IF Id_Null(Timer_id) THEN
         Timer_id := Create_timer('LOAD_TIMER', 6000, NO_REPEAT);
      ELSE
        SET_TIMER(timer_id, 6000, NO_REPEAT);
      END IF;    	
 execute_query;
EXCEPTION WHEN 	NOT_CONN or NOT_CONN1  
	THEN
	 do_log:=false;	 
	 While do_log =false Loop
          n_date := to_date(:System.Current_Datetime,'DD-MON-YYYY HH24:MI:SS')+0.002; 
          While to_date(:System.Current_Datetime,'DD-MON-YYYY HH24:MI:SS')<n_date Loop
        	null;
         end loop;
	    do_log:=get_connection(un,pw1,cs); 	    
	 End Loop;  

        logout;
     LOGON(un,pw);
-- 	 в это месте говорит ALREADY LOGGED ON. Must logout before changing connections

	 timer_id := FIND_TIMER ('LOAD_TIMER');
   IF Id_Null(Timer_id) THEN
      Timer_id := Create_timer('LOAD_TIMER', 6000, NO_REPEAT);
   ELSE
       SET_TIMER(timer_id, 6000, NO_REPEAT);
   END IF;	 
END;


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Функция
FUNCTION GET_CONNECTION ( 
  v_userName IN VARCHAR2 DEFAULT NULL,
  v_password IN VARCHAR2 DEFAULT NULL,
  v_datasource IN VARCHAR2 DEFAULT NULL
) RETURN BOOLEAN IS
  c_attempts CONSTANT INTEGER := 3;
  un VARCHAR2(80);
  pw VARCHAR2(80);
  cn VARCHAR2(80);
  tmpConInfo VARCHAR2(255);
  tmpConHandle EXEC_SQL.ConnType;
  logonSuccessful BOOLEAN := FALSE;
BEGIN 
--	message('get_con') ; pause;  
      un := v_username;
      pw := v_password;
      cn := v_datasource;    
    IF ((un is null) and (pw is null) and (cn is null)) THEN      
      logonSuccessful:=false;
    END IF;
    BEGIN
      tmpConHandle := EXEC_SQL.OPEN_CONNECTION(un, pw, cn);
    EXCEPTION
    WHEN EXEC_SQL.PACKAGE_ERROR THEN     
      logonSuccessful:=false;
    END;
    IF EXEC_SQL.VALID_CONNECTION(tmpConHandle) THEN
      logonSuccessful := TRUE;
      EXEC_SQL.CLOSE_CONNECTION(tmpConHandle);
    END IF;
  IF logonSuccessful THEN
    RETURN TRUE;
  ELSE
    RETURN FALSE;
  END IF;  
END;
...
Рейтинг: 0 / 0
26.06.2014, 16:30
    #38681028
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить соединение в Forms
Мне кажется идея бредовая. Но это нужно нормально с заказчиком разговаривать, что требуется.

Ну и второе, что за Forms. Он разный. Версия?
...
Рейтинг: 0 / 0
26.06.2014, 16:37
    #38681034
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить соединение в Forms
Forms 6i.
Знаю, что бредовая, но именно заказчик требует автоматического восстановления соединения
...
Рейтинг: 0 / 0
26.06.2014, 16:48
    #38681049
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить соединение в Forms
Лично я бы сделал отдельное приложение монитор.

Запустили монитор, он запустил Forms Runtime, если Forms Runtime подвис/вылетел/потерял соединение - убили процесс, запустили снова.

Поздно пить боржоми. Почки уже отвалились. Только в морг. IMHO & AFAIK

Как банальный вариант, просто батник: запуск Forms + goto на начало. В Forms на таймер выход.
...
Рейтинг: 0 / 0
26.06.2014, 16:58
    #38681060
-=APS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить соединение в Forms
А что за обработка на клиенте-то у вас? Нельзя ли ее на сервер, на scheduler вынести?

А если, как вариант, брутально запустить новый экземпляр можно попробовать:
host('start ifrun60 module=... userid=...');
и выйти из дисконнектнувшегося экземпляра?
...
Рейтинг: 0 / 0
26.06.2014, 16:58
    #38681062
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить соединение в Forms
монитор сверху не катит. Я не могу понять почему в моем примере не происходит logout, только в этом загвоздка. если я делаю тестовую форму с проверкой соединения по кнопке - все работает, а тут по таймеру, получается, что что-то не устраивает Forms
...
Рейтинг: 0 / 0
26.06.2014, 17:01
    #38681067
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить соединение в Forms
-=APS=-,нет, обработка должна быть как есть. А если хост запущу, то из этого приложения я же не выйду пока новое не закроется
...
Рейтинг: 0 / 0
26.06.2014, 17:10
    #38681081
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить соединение в Forms
новый2А если хост запущу, то из этого приложения я же не выйду пока новое не закроется
Неправда. "Вы просто не умеете его готовить" ( C )

Но через HOST это сильно топорно. Id процесса не получить, процесс не отмониторить, не убить и т.д. В общем, лично мне такое решение нафиг.

Ну и не факт, что при обломившемся коннекте удастся "просто выйти". IMHO & AFAIK.

-=APS=-...и выйти из дисконнектнувшегося экземпляра?
Я так раньше делал модуль обновления софта на клиенте ))):

Клиент понимает, что он старый. Копирует модуль "обновлялку" в новое место (что бы саму обновлялку можно было запускать). Запускаем обновлялку и выходим из основной программы. Обновлялка ждет завершение основного процесса (для таких вещей и хочется ID процесса). Софт обновляется (включая обновлялку в основной директории, сами работаем из запасной). Запускаем новую версию софта.
( C ) www.kamis.ru
...
Рейтинг: 0 / 0
26.06.2014, 17:10
    #38681082
-=APS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить соединение в Forms
За счет start, по идее, вернет управление сразу.
...
Рейтинг: 0 / 0
26.06.2014, 17:56
    #38681136
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить соединение в Forms
-=APS=-, что такое start?
...
Рейтинг: 0 / 0
26.06.2014, 18:15
    #38681160
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить соединение в Forms
Команда такая, в Windows.
...
Рейтинг: 0 / 0
26.06.2014, 18:21
    #38681165
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить соединение в Forms
в общем, не делает logout только если падает на exception в триггеру WHEN-TIMER-EXPIRED (((
...
Рейтинг: 0 / 0
26.06.2014, 19:02
    #38681206
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить соединение в Forms
даже так: при обрыве связи не делается logout, соответственно нельзя сделать logon. как бороться? может еще есть возможность отконнектиться от формы?
...
Рейтинг: 0 / 0
26.06.2014, 19:08
    #38681210
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановить соединение в Forms
свое мнение я уже высказал: кильнуть процесс и запустить по новой. Все остальное - может сработать, а может и нет.

Лучше уж тогда с фотоаппаратом по улице ходить и фотографировать встретившихся динозавров. Как известно, вероятность 1/2, или встретишь или нет. А за не фейковую фотку динозавра бабла можно срубить не мало IMHO.
...
Рейтинг: 0 / 0
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Восстановить соединение в Forms / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]