Для тестирования обработки исключений в случае разрыва соединения полезно иметь возможность программно запрашивать базу данных на разрыв соединения.
Какой лучший способ сделать это?
Вот пара битов кода, чтобы справиться с этим. Это работает в многоузловой среде RAC. Предполагается, что у вас есть запись TNS для каждого из ваших экземпляров кластера.
скрипт оболочки для разрыва соединения:
#!/bin/sh # oracle-killsession -- kill a specified oracle session sid=$1; ser=$2; inst=$3 echo -n sys password: stty -echo; read pass; stty echo echo "alter system kill session '$sid,$ser';"| sqlplus -SL sys/$pass@$inst as sysdba
функция на стороне клиента (это в python) для генерации вызова скрипта. Я называю это в начале моей тестовой программы и печатаю Строка, чтобы я мог вырезать и вставить.
def killstring(curs): """return a string that will kill this db connection""" curs.execute("""SELECT dbms_debug_jdwp.current_session_id, dbms_debug_jdwp.current_session_serial, sys_context('USERENV', 'INSTANCE_NAME') FROM dual""") (sid,serial,instance)=curs.fetchone() s="oracle-killsession %s %s %s"%(sid,serial,instance) return s
и пример вызова
$ oracle-killsession 98 45809 orcl2 sys password: System altered.
и от моего клиента ... ура !!!
cx_Oracle.DatabaseError: ORA-00028: your session has been killed