Transparent application failover (TAF) is the ability of applications to automatically
reconnect to the database if the connection fails. If the server fails, the connection
also fails. The next time the client tries to use the connection to execute a new
SQL statement, for example, the operating system displays an error to the client.
At this point, the user must log in to the database again. With TAF, however, Oracle
automatically obtains a new connection to the database. This allows the user to
continue to work using the new connection as if the original connection had never
failed. If the client is not involved in a database transaction, then users may
not notice the failure of the server. Because this reconnect happens automatically,
the client application code may not need changes to use TAF. TAF automatically restores:
Unfortunately, TAF cannot automatically restore some session properties. If the
application issued ALTER SESSION commands, then the application must reissue them
after TAF processing is complete.
Frequently failure of one instance and failover to another takes time. Because of
this delay, you may want to inform users that failover is in progress. Additionally,
the session on the initial instance may have received some ALTER SESSION commands.
These will not be automatically reissued on the second instance. You may need to
reissue these commands on the second instance.
To address such problems, you can use OracleConnection.Failover event. Event
is raised during session recovery process when connection is lost. When connection
failure is detected Failover event is raised first time. Then application
keeps raising it until connection is restored or user stops failover process.
Transparent Application Failover Restrictions:
The tnsnames.ora file should be suitably modified for your database entry so that
TAF tries to reconnect when the database connection is lost. The tnsnames.ora file
is located at <Oracle_Home>/network/Admin directory. Your database TNS entry
should look like this :
(ADDRESS = (PROTOCOL = TCP)(HOST = <myhostname>)(PORT = <1521>))
(SERVICE_NAME = <dbfailover>)
(FAILOVER_MODE = (TYPE = SELECT) (METHOD = BASIC) (RETRIES=100)
where <Oracle_Home> is the directory where your database or SQL*Plus client
is installed. Replace the values for the database parameters highlighted in bold
with your database parameters.
Following example demonstrate using TAF in your application.
First register method as Failover event handler.
OracleConnection conn = new OracleConnection(
"User Id=scott;Password=tiger;Data Source=DBFAILOVER.US.ORACLE.COM");
conn.Failover += new OracleFailoverEventHandler(conn.OnFailover);
Dim conn As OracleConnection = new OracleConnection( _
"User Id=scott;Password=tiger;Data Source=DBFAILOVER.US.ORACLE.COM")
Second add method that will handle TAF event.
public void OnFailover(object sender, OracleFailoverEventArgs eventArgs)
// failover begins
// failover is aborted
// failover is complete successful
//error occurs while reconnecting
// Retry reconnecting
eventArgs.Retry = true;
// reautentication is required during Failover
// Something goes wrong
MessageBox.Show("Unknown failover stage");
Private Sub OracleConnection_Failover(ByVal sender As Object, _
ByVal eventArgs As OracleFailoverEventsArgs) Handles OracleConnection.Failover
' failover begins
' failover is aborted
' failover is complete successful
' error occurs while reconnecting
' Retry reconnecting
eventArgs.Retry = true
' reautentication is required during Failover
' Something goes wrong
MessageBox.Show("Unknown failover stage")
When TAF occured this method will be called. And you can inform user about failover
progress or ask user about reconnecting to Oracle instanse.
For demonstrating TAF, user should restart the database from SQL* Plus using following
SQL> Connect sys/<your_sys_password>@<Your_TNSName> as sysdba
SQL> startup force
After restarting the database, the user should return to the application and refresh
the data by clicking "RefreshRecords". The Failover event is called and the Failover
handler method displays the appropriate messages in a message box. The query will
be executed again against the database using a new connection, data fetched and
displayed in the data grid.