OCI8 Поддршка за транспарентно откажување на апликација (TAF)
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
OCI8 Поддршка за транспарентно откажување на апликација (TAF)
Референца за `oci8.taf.php` со подобрена типографија и навигација.
OCI8 Поддршка за транспарентно откажување на апликација (TAF)
TAF е функција на Oracle базата на податоци што обезбедува висока достапност. Овозможува PHP OCI8 апликациите автоматски да се поврзат со претходно конфигурирана база на податоци кога конективноста на базата на податоци ќе откаже поради неуспех на инстанцата или мрежата.
Во конфигуриран систем на Oracle база на податоци, TAF се случува кога PHP апликацијата открива дека инстанцата на базата на податоци е неактивна или недостапна. Воспоставува врска со друг јазол во Oracle » RAC конфигурација, резервна база на податоци во живо или самата инстанца на базата на податоци. Погледнете » Oracle Call Interface Programmer's Guide за повеќе информации за OCI TAF.
Повикот на апликацијата може да се регистрира со oci_register_taf_callback(). За време на префрлањето, нормалното обработување на апликацијата престанува и се повикува регистрираниот повик. Повикот ја известува апликацијата за настаните од префрлањето. Ако префрлањето успее, нормалното обработување ќе продолжи. Ако префрлањето откаже, сите последователни операции на базата на податоци во апликацијата ќе откажат поради недостапност на врска.
Кога врската ќе се префрли на друга база на податоци, повикот може да ја ресетира секоја потребна состојба на врската, на пример, повторно да ги изврши сите потребни команди ALTER SESSION ако услугата на базата на податоци немала овозможено -failover_restore.
Повикот на апликацијата може да се отстрани со повикување oci_unregister_taf_callback().
Конфигурирање на транспарентно префрлање на апликации
TAF може да се конфигурира на страната на PHP OCI8 или во конфигурацијата на базата на податоци. Ако и двете се конфигурирани, поставките од страната на базата на податоци имаат предност.
Конфигурирајте TAF во PHP OCI8 (страната на клиентот) со вклучување на параметарот FAILOVER_MODE во делот CONNECT_DATA на дескрипторот за поврзување. Погледнете Конфигурирање на транспарентно префрлање на апликации во » Oracle Database Net Services Administrator's Guide за повеќе информации за конфигурацијата на TAF од страната на клиентот.
Пример tnsnames.ora за конфигурирање на TAF повторно поврзување со истата инстанца на базата на податоци:
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = orclpdb1)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 20)
(DELAY = 15))))
Алтернативно, конфигурирајте TAF на страната на базата на податоци со измена на целната услуга со » srvctl (за RAC) или » DBMS_SERVICE.MODIFY_SERVICE packaged procedure (for single instance databases).
пакувана процедура (за бази на податоци со една инстанца).
Користење TAF повици во OCI8
TAF повикот е функција на апликацијата што може да се регистрира за да биде повикана за време на префрлањето. Се повикува неколку пати додека се воспоставува повторно поврзувањето на апликацијата.
Корисничка функција за враќање на повици за регистрација за Oracle TAF. Може да биде стринг со името на функцијата или Затворање (анонимна функција).
connection-
Повикот прво се случува кога ќе се открие губење на врската. Ова му овозможува на апликацијата да постапи соодветно за претстојното одложување на префрлањето. Ако префрлањето е успешно, повикот се активира откако врската ќе се воспостави повторно и ќе биде употреблива. Во овој момент, апликацијата може да ги синхронизира поставките на сесијата и да преземе дејства како што е информирање на корисникот дека се случило префрлање. Ако префрлањето не е успешно, се случува повикот за да ја информира апликацијата дека префрлањето не се случило и врската е неупотреблива. oci_register_taf_callback()Oracle врската на која е регистриран TAF повикот преку
event-
. Врската не е валидна додека префрлањето не заврши успешно.
-
OCI_FO_BEGINНастанот на префрлање го означува тековниот статус на префрлањето. -
OCI_FO_ENDозначува дека префрлањето открило изгубена врска и префрлањето започнува. -
OCI_FO_ABORTозначува успешно завршување на префрлањето. -
OCI_FO_ERRORозначува дека префрлањето било неуспешно и нема опција за повторен обид. -
OCI_FO_REAUTHисто така означува дека префрлањето било неуспешно, но му дава можност на апликацијата да ја обработи грешката и да врати OCI_FO_RETRY за да го повтори префрлањето.
-
type-
означува дека Oracle корисникот е повторно автентициран.
-
OCI_FO_SESSIONтипот на префрлање. Ова му овозможува на повикот да знае каков тип на префрлање побарала апликацијата. Обичните вредности се следниве: -
OCI_FO_SELECTозначува дека корисникот побарал само префрлање на сесијата. На пример, ако врската на корисникот е изгубена, тогаш автоматски се создава нова сесија за корисникот на резервната копија. Овој тип на префрлање не се обидува да ги обнови SELECT-ите.
-
return value-
-
0означува дека корисникот побарал и SELECT префрлање. Им овозможува на корисниците со отворени курсори да продолжат да преземаат податоци од нив по неуспехот. -
OCI_FO_RETRYозначува дека чекорите на префрлање треба да продолжат нормално.
-
означува дека Oracle треба да го обиде префрлањето повторно. Во случај на грешка при префрлање на нова врска, TAF може да го повтори префрлањето. Типично, кодот на апликацијата треба да спие некое време пред да врати OCI_FO_RETRY.
<?php
// Define userspace callback
class MyClass {
public static $retry_count;
public static function TAFCallback($conn, $event, $type)
{
switch ($event) {
case OCI_FO_BEGIN:
printf(" Failing Over ... Please stand by\n");
printf(" Failover type was found to be %s \n",
(($type==OCI_FO_SESSION) ? "SESSION"
:(($type==OCI_FO_SELECT) ? "SELECT" : "UNKNOWN!")));
self::$retry_count = 0;
break;
case OCI_FO_ABORT:
// The application cannot continue using the database
printf(" Failover aborted. Failover will not take place.\n");
break;
case OCI_FO_END:
// Failover completes successfully. Inform users a failover occurs.
printf(" Failover ended ... resuming services\n");
break;
case OCI_FO_REAUTH:
printf(" Failed over user ... resuming services\n");
// Replay any ALTER SESSION commands associated with this connection
// eg. oci_parse($conn, ‘ALTER SESSION …’) ;
break;
case OCI_FO_ERROR:
// Stop retrying if we have already attempted for 20 times.
if (self::$retry_count >= 20)
return 0;
printf(" Failover error received. Sleeping...\n");
sleep(10);
self::$retry_count++;
return OCI_FO_RETRY; // retry failover
break;
default:
printf("Bad Failover Event: %d.\n", $event);
break;
}
return 0;
}
}
$fn_name = 'MyClass::TAFCallback';
$conn = oci_connect('hr', 'welcome', 'orcl');
$sysconn = oci_connect('system', 'oracle', 'orcl');
// Use a privileged connection to construct a SQL statement that will initiate failover
$sql = <<< 'END'
select unique 'alter system disconnect session '''||sid||','||serial#||''''
from v$session_connect_info
where sid = sys_context('USERENV', 'SID')
END;
$s = oci_parse($conn, $sql);
oci_execute($s);
$r = oci_fetch_array($s);
$disconnectssql = $r[0];
oci_register_taf_callback($conn, $fn_name); // Register TAFCallback to Oracle TAF
print "Parsing user query\n";
$sql = "select systimestamp from dual";
$stmt = oci_parse($conn, $sql);
// For example, if a connection loss occurs at this point, oci_execute() will
// detect the loss and failover begins. During failover, oci_execute() will
// invoke the TAF callback function several times. If the failover is successful,
// a new connection is transparently created and oci_execute() will continue as
// usual. The connection session settings can be reset in the TAF callback
// function. If the failover is aborted, oci_execute() will return an error
// because a valid connection is not available.
// Disconnect the user, which initiates failover
print "Disconnecting the user\n";
$discsql = oci_parse($sysconn, $disconnectssql);
oci_execute($discsql);
print "Executing user query\n";
$e = oci_execute($stmt);
if (!$e) {
$m = oci_error($stmt);
trigger_error("Could not execute statement: ". $m['message'], E_USER_ERROR);
}
$row = oci_fetch_array($stmt);
print $row[0] . "\n";
// do other SQL statements with the new connection, if it is valid
// $stmt = oci_parse($conn, . . .);
?>