Martins Blog

Trying to explain complex things in simple terms

Playing with Application Continuity in RAC 12c

Posted by Martin Bach on December 13, 2013

One of the more interesting features in Oracle 12c RAC is application continuity. Why do I believe it is? Because it relieves developers from having to think about retrying connections and catch SQLExceptions in the code. I already thought that Fast Application Notification and Fast Connect Failover (FCF) are great, _but_ they required the developer to understand RAC and Oracle which you can’t take for granted. In fact looking back over the last few years since I co-wrote Pro Oracle Database 11g RAC on Linux the number 1 complaint I got from developers was that RAC was too complex (see for example in this thread on oracle-l)

Now Application Continuity takes away 2 problems I have seen.

  1. You no longer need the OCI libraries
  2. You no longer need to code for session failure

I mention the OCI libraries here because I have seen applications where developers believed they were using Transparent Application but weren’t (if you see “jdbc:oracle:thin:…” in the connection string for an application you can be sure it won’t use TAF). Also I haven’t really seen any real UCP implementation outside/not provided by Oracle. But there is hope!

This is a 2 part post, in the first one I’m just showing how to create a Connection Pool and use Application Continuity. In the second part which I am showing you how to use Tomcat 7/JDK6/Oracle Linux 6.4 to create a Pooled Data Source using JNDI.

The code

The code is rather simple and more or less taken from the Getting started with UCP chapter from the documentation. There was quite some uncertainty around AC for me when I looked at it. Once I realised that AC and UCP are complementary technologies it all made sense. The Data Source you get with AC is for a single session. Only when you combine it with the PoolDataSource can you create a pool. The way UCP creates sessions is based on the Connection Factory class, and this is where the only change in my code was made. Pre-Application Continuity you used oracle.jdbc.pool.OracleDataSource, now it’s oracle.jdbc.replay.OracleDataSourceImpl. Which is good news as you can quite easily change from the 11g model to 12c as you can see in the next post.

Now here’s the Java class I wrote.


import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import oracle.ucp.jdbc.PoolDataSourceFactory;
import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.ValidConnection;
import java.sql.ResultSet;

public class UCPTest {


  public static void main (String[] args)
    throws Exception
  {
    String message;
    
    if (args.length == 0) {
      message = "default";
    } else {
      message = args[0];
    }

    PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();
    pds.setConnectionFactoryClassName("oracle.jdbc.replay.OracleDataSourceImpl");

    System.out.println("connection factory set");

    String URL = "jdbc:oracle:thin:@(DESCRIPTION = (TRANSPORT_CONNECT_TIMEOUT=3) (RETRY_COUNT=20)(FAILOVER=ON) " +
     (ADDRESS = (PROTOCOL = TCP)(HOST = rac12scan.gns.example.com)(PORT = 1521)) (CONNECT_DATA = " +
     (SERVER = DEDICATED) (SERVICE_NAME = ACTEST)))";
    System.out.println("Using URL\n" + URL);
    pds.setURL(URL);
    pds.setUser("martin");
    pds.setPassword("***");

    pds.setInitialPoolSize(10);
    pds.setMinPoolSize(10);
    pds.setMaxPoolSize(20);

    // RAC Features
    pds.setConnectionPoolName("Application Continuity Pool");
    pds.setFastConnectionFailoverEnabled(true);
    // use srvctl config nodeapps to get the ONS ports on the cluster
    pds.setONSConfiguration("nodes=192.168.100.30:6200,192.168.100.32:6200");

    System.out.println("pool configured, trying to get a connection");

    Connection conn = pds.getConnection();
    if (conn == null || !((ValidConnection) conn).isValid())  {

      System.out.println("connection is not valid");
      throw new Exception ("invalid connection obtained from the pool");
    }

    if ( conn instanceof oracle.jdbc.replay.ReplayableConnection ) {
      System.out.println("got a replay data source");
    } else {
      System.out.println("this is not a replay data source. Why not?");
    }

    System.out.println("got a connection! Getting some stats if possible");
    oracle.ucp.jdbc.JDBCConnectionPoolStatistics stats = pds.getStatistics();
    System.out.println("\tgetAvailableConnectionsCount() " + stats.getAvailableConnectionsCount());
    System.out.println("\tgetBorrowedConnectionsCount() " + stats.getBorrowedConnectionsCount() );
    System.out.println("\tgetRemainingPoolCapacityCount() " + stats.getRemainingPoolCapacityCount());
    System.out.println("\tgetTotalConnectionsCount() " + stats.getTotalConnectionsCount());

    System.out.println(((oracle.ucp.jdbc.oracle.OracleJDBCConnectionPoolStatistics)pds.getStatistics()).getFCFProcessingInfo());

    System.out.println("Now working");

    java.sql.CallableStatement cstmt = conn.prepareCall("{call canIcarryOn(?)}");
    cstmt.setString(1, message);
    cstmt.execute();

    System.out.println("Statement executed. Now closing down");
    System.out.println("Almost done! Getting some more stats if possible");

    stats = pds.getStatistics();
    System.out.println("\tgetAvailableConnectionsCount() " + stats.getAvailableConnectionsCount());
    System.out.println("\tgetBorrowedConnectionsCount() " + stats.getBorrowedConnectionsCount() );
    System.out.println("\tgetRemainingPoolCapacityCount() " + stats.getRemainingPoolCapacityCount());
    System.out.println("\tgetTotalConnectionsCount() " + stats.getTotalConnectionsCount());

    System.out.println(((oracle.ucp.jdbc.oracle.OracleJDBCConnectionPoolStatistics)pds.getStatistics()).getFCFProcessingInfo());

    cstmt.close();
    conn.close();
    conn = null;
  }
}

I have used the following Classpath to compile it:

CLASSPATH=/m/apache-tomcat-7.0.47/lib/ons.jar
CLASSPATH=$CLASSPATH:/m/apache-tomcat-7.0.47/lib/ojdbc6.jar
CLASSPATH=$CLASSPATH:/m/apache-tomcat-7.0.47/lib/ucp.jar:.
export CLASSPATH

All JAR files are from my 12c RAC installation. The database connection is made against a PDB (open on both instances) and a service defined as follows:

[oracle@rac12node1 ~]$ srvctl add service -db RAC12C -service ACTEST -preferred RAC12C1 \
> -available RAC12C2 -policy automatic -failovertype TRANSACTION -pdb DEMOPDB -clbgoal SHORT \
> -rlbgoal SERVICE_TIME -notification true -commit_outcome TRUE

Also pretty much a copy and paste from the documentation with a preferred and an available instance. The only missing bit is the stored procedure. It simply inserts a message into a table together with a timestamp. It then sleeps for 60 seconds and commits. The sleeping is important because a) allows me to kill smon of the service it runs on and b) demonstrates that the commit will happen even if you killed the session implicitly.

To better understand what was going on I created a log file using the log4j framework. The logging.properties file is shown in the appendix. I used jar -tf to get all that information, then replaced “.class” with “level=ALL” and read it into the file. The class names seem to have changed from 11.2 when I last tested. Be aware that UCP uses MBeans to allow for remote management of the pool, and MBeans are very verbose. This is a research/debug log file, not a production configuration!

The test

The test is simple. I start the pool on the dev machine. As soon as I see the “now working” message I kill the instance the session is running on. Then wait to see what happens :)

The output is shown here

[oracle@oracledev ~]$ java -Djava.util.logging.config.file=logging.properties UCPTest all_out_logging2
connection factory set
Using URL
jdbc:oracle:thin:@(DESCRIPTION = (TRANSPORT_CONNECT_TIMEOUT=3) (RETRY_COUNT=20)(FAILOVER=ON) (ADDRESS = 
(PROTOCOL = TCP)(HOST = rac12scan.gns.example.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED)
(SERVICE_NAME = ACTEST)))
pool configured, trying to get a connection
got a replay data source
got a connection! Getting some stats if possible
	getAvailableConnectionsCount() 9
	getBorrowedConnectionsCount() 1
	getRemainingPoolCapacityCount() 10
	getTotalConnectionsCount() 10

Now working
Statement executed. Now closing down
Almost done! Getting some more stats if possible
	getAvailableConnectionsCount() 9
	getBorrowedConnectionsCount() 1
	getRemainingPoolCapacityCount() 10
	getTotalConnectionsCount() 10
12-Dec-2013 11:33 SUCCESS <Type:SERVICE_UP> <Service:"actest"> <Instance:"null"> <Db:"rac12c"> 
 Connections:(Available=9 Affected=0 FailedToProcess=0 MarkedDown=0 Closed=0)
 (Borrowed=1 Affected=0 FailedToProcess=0 MarkedDown=0 MarkedDeferredClose=0 Closed=0) 
 cardinality=1 targetedToTear=0 tornDown=0 markedToClose=0 targetUpEventNewConns=0 upEventNewConns=0
12-Dec-2013 11:33 SUCCESS <Type:SERVICE_UP> <Service:"actest"> <Instance:"rac12c2"> <Db:"rac12c"> 
 Connections:(Available=0 Affected=0 FailedToProcess=0 MarkedDown=0 Closed=0)
 (Borrowed=1 Affected=0 FailedToProcess=0 MarkedDown=0 MarkedDeferredClose=0 Closed=0) 
 cardinality=1 targetedToTear=0 tornDown=0 markedToClose=0 targetUpEventNewConns=9 upEventNewConns=9
12-Dec-2013 11:33 SUCCESS <Reason:failure> <Type:SERVICE_DOWN> <Service:"actest"> <Instance:"null"> <Db:"rac12c"> 
 Connections:(Available=0 Affected=0 FailedToProcess=0 MarkedDown=0 Closed=0)
 (Borrowed=1 Affected=1 FailedToProcess=0 MarkedDown=1 MarkedDeferredClose=0 Closed=1)
12-Dec-2013 11:33 SUCCESS <Reason:failure> <Type:SERVICE_DOWN> <Service:"actest"> <Instance:"rac12c1"> <Db:"rac12c"> 
 Connections:(Available=9 Affected=9 FailedToProcess=0 MarkedDown=9 Closed=9)
 (Borrowed=1 Affected=1 FailedToProcess=0 MarkedDown=1 MarkedDeferredClose=0 Closed=1)
12-Dec-2013 11:33 FAILURE <Type:NOT_PROCESSED> <Service:"rac12c"> <Instance:"rac12c1"> <Db:"rac12c"> 
 Connections:(Available=0 Affected=0 FailedToProcess=0 MarkedDown=0 Closed=0)
 (Borrowed=0 Affected=0 FailedToProcess=0 MarkedDown=0 MarkedDeferredClose=0 Closed=0)

On the database level I observed this:

SQL> select count(inst_id), inst_id, status from gv$session where username = 'MARTIN' group by inst_id, status

COUNT(INST_ID)	  INST_ID STATUS
-------------- ---------- --------
             9          1 INACTIVE
             1          1 ACTIVE

-- then kill the 1st instance

SQL> r
  1* select count(inst_id), inst_id, status from gv$session where username = 'MARTIN' group by inst_id, status

no rows selected

-- and it automatically fixes itself

SQL> r
  1* select count(inst_id), inst_id, status from gv$session where username = 'MARTIN' group by inst_id, status

COUNT(INST_ID)	  INST_ID STATUS
-------------- ---------- --------
             9          2 INACTIVE
             1          2 ACTIVE

In addition the insert made by the PL/SQL procedure has been performed (replayed) by the previously active session.

Lessons learnt

I first tried the “EZConnect” syntax in the URL which didn’t work as I expected. After the failover the only session that was preserved/failed over was that 1 active session. The pool had 19 sessions available but didn’t get back to the initial pool size after the failover. This didn’t happen with the TNS-like connect string you find in the above example.

Unrelated to UCP/AC I had a few connection reset IO Exceptions. It turned out that all SCAN listeners were on my first node (huh?). Restarting them fixed the Connection Reset errors.

And finally, I have been able to get the most fine-grained logging of UCP with the logging.properties file shown below.

Appendix

The logging properties file for Log4J

handlers = java.util.logging.FileHandler
java.util.logging.FileHandler.pattern=/root/ucp_standalone/ucp.log
java.util.logging.FileHandler.formatter = oracle.ucp.util.logging.UCPFormatter
java.util.logging.FileHandler.limit=10000000
java.util.logging.FileHandler.count=4

.level = FINEST

oracle.ucp.AbandonedConnectionTimeoutCallback.level = ALL
oracle.ucp.ConnectionAffinityCallback$AffinityPolicy.level = ALL
oracle.ucp.ConnectionAffinityCallback.level = ALL
oracle.ucp.ConnectionFactoryAdapter.level = ALL
oracle.ucp.ConnectionHarvestingCallback.level = ALL
oracle.ucp.ConnectionLabelingCallback.level = ALL
oracle.ucp.ConnectionRetrievalInfo.level = ALL
oracle.ucp.NoAvailableConnectionsException.level = ALL
oracle.ucp.TimeToLiveConnectionTimeoutCallback.level = ALL
oracle.ucp.UniversalConnectionPool.level = ALL
oracle.ucp.UniversalConnectionPoolAdapter.level = ALL
oracle.ucp.UniversalConnectionPoolException.level = ALL
oracle.ucp.UniversalConnectionPoolLifeCycleState.level = ALL
oracle.ucp.UniversalConnectionPoolStatistics.level = ALL
oracle.ucp.UniversalPooledConnection.level = ALL
oracle.ucp.UniversalPooledConnectionStatus.level = ALL
oracle.ucp.admin.JDBCUniversalConnectionPoolMBeanImpl.level = ALL
oracle.ucp.admin.MetricsUpdateTimerTask.level = ALL
oracle.ucp.admin.UniversalConnectionPoolMBean.level = ALL
oracle.ucp.admin.UniversalConnectionPoolMBeanBase.level = ALL
oracle.ucp.admin.UniversalConnectionPoolManager.level = ALL
oracle.ucp.admin.UniversalConnectionPoolManagerBase$UCPMetric.level = ALL
oracle.ucp.admin.UniversalConnectionPoolManagerBase.level = ALL
oracle.ucp.admin.UniversalConnectionPoolManagerHelper.level = ALL
oracle.ucp.admin.UniversalConnectionPoolManagerImpl.level = ALL
oracle.ucp.admin.UniversalConnectionPoolManagerMBean.level = ALL
oracle.ucp.admin.UniversalConnectionPoolManagerMBeanImpl.level = ALL
oracle.ucp.common.AbandonedConnectionTimerTask.level = ALL
oracle.ucp.common.AvailableConnections.level = ALL
oracle.ucp.common.AvailableConnectionsBase.level = ALL
oracle.ucp.common.AvailableConnectionsManyCollections.level = ALL
oracle.ucp.common.AvailableConnectionsManyCollectionsWithLabels.level = ALL
oracle.ucp.common.AvailableConnectionsOneCollection.level = ALL
oracle.ucp.common.BorrowRequestQueue$WaitTicket.level = ALL
oracle.ucp.common.BorrowRequestQueue.level = ALL
oracle.ucp.common.ConnectionFactoryAdapterBase.level = ALL
oracle.ucp.common.ConnectionHarvestingComparator.level = ALL
oracle.ucp.common.ConnectionHarvestingTimerTask.level = ALL
oracle.ucp.common.ConnectionsContainer.level = ALL
oracle.ucp.common.FailoverEvent.level = ALL
oracle.ucp.common.FailoverEventHandlerTask.level = ALL
oracle.ucp.common.FailoverEventHandlerTaskBase.level = ALL
oracle.ucp.common.Failoverable.level = ALL
oracle.ucp.common.FailoverableUniversalPooledConnection.level = ALL
oracle.ucp.common.FailoverableUniversalPooledConnectionBase.level = ALL
oracle.ucp.common.InactiveConnectionTimerTask.level = ALL
oracle.ucp.common.TimeToLiveConnectionTimerTask.level = ALL
oracle.ucp.common.UniversalConnectionPoolBase.level = ALL
oracle.ucp.common.UniversalConnectionPoolImpl$ConnCreateTask.level = ALL
oracle.ucp.common.UniversalConnectionPoolImpl$UniversalConnectionPoolInternal.level = ALL
oracle.ucp.common.UniversalConnectionPoolImpl.level = ALL
oracle.ucp.common.UniversalConnectionPoolStatisticsImpl.level = ALL
oracle.ucp.common.UniversalPooledConnectionImpl.level = ALL
oracle.ucp.jdbc.ConnectionConnectionPool.level = ALL
oracle.ucp.jdbc.ConnectionInitializationCallback.level = ALL
oracle.ucp.jdbc.ConnectionLabelingCallback.level = ALL
oracle.ucp.jdbc.ConnectionPoolDataSourceConnectionFactoryAdapter.level = ALL
oracle.ucp.jdbc.ConnectionWithAbandonedTimeout.level = ALL
oracle.ucp.jdbc.ConnectionWithTimeToLiveTimeout.level = ALL
oracle.ucp.jdbc.DataSourceConnectionFactoryAdapter.level = ALL
oracle.ucp.jdbc.DriverConnectionFactoryAdapter.level = ALL
oracle.ucp.jdbc.HarvestableConnection.level = ALL
oracle.ucp.jdbc.JDBCConnectionFactoryAdapter.level = ALL
oracle.ucp.jdbc.JDBCConnectionPool.level = ALL
oracle.ucp.jdbc.JDBCConnectionPoolStatistics.level = ALL
oracle.ucp.jdbc.JDBCConnectionPoolStatisticsImpl.level = ALL
oracle.ucp.jdbc.JDBCConnectionRetrievalInfo.level = ALL
oracle.ucp.jdbc.JDBCUniversalPooledConnection.level = ALL
oracle.ucp.jdbc.LabelableConnection.level = ALL
oracle.ucp.jdbc.PoolDataSource.level = ALL
oracle.ucp.jdbc.PoolDataSourceFactory.level = ALL
oracle.ucp.jdbc.PoolDataSourceImpl$AutoProperty.level = ALL
oracle.ucp.jdbc.PoolDataSourceImpl$AutoPropertyX.level = ALL
oracle.ucp.jdbc.PoolDataSourceImpl.level = ALL
oracle.ucp.jdbc.PoolXADataSource.level = ALL
oracle.ucp.jdbc.PoolXADataSourceImpl.level = ALL
oracle.ucp.jdbc.PooledConnectionConnectionPool.level = ALL
oracle.ucp.jdbc.ValidConnection.level = ALL
oracle.ucp.jdbc.XAConnectionConnectionPool.level = ALL
oracle.ucp.jdbc.XADataSourceConnectionFactoryAdapter.level = ALL
oracle.ucp.jdbc.oracle.Ctag.level = ALL
oracle.ucp.jdbc.oracle.DataBasedConnectionAffinityCallback.level = ALL
oracle.ucp.jdbc.oracle.FailoverActionResult.level = ALL
oracle.ucp.jdbc.oracle.FailoverStatisticsAccumulator.level = ALL
oracle.ucp.jdbc.oracle.FailoverStatisticsCounters.level = ALL
oracle.ucp.jdbc.oracle.FailoverStatisticsItem$Type.level = ALL
oracle.ucp.jdbc.oracle.FailoverStatisticsItem.level = ALL
oracle.ucp.jdbc.oracle.FailoverablePooledConnection.level = ALL
oracle.ucp.jdbc.oracle.FailoverablePooledConnectionHelper$InvocationVector.level = ALL
oracle.ucp.jdbc.oracle.FailoverablePooledConnectionHelper.level = ALL
oracle.ucp.jdbc.oracle.ONSDatabaseEventHandlerTask.level = ALL
oracle.ucp.jdbc.oracle.ONSDatabaseFailoverEvent.level = ALL
oracle.ucp.jdbc.oracle.ONSOracleFailoverEventSubscriber.level = ALL
oracle.ucp.jdbc.oracle.ONSOracleRuntimeLBEventSubscriber.level = ALL
oracle.ucp.jdbc.oracle.ONSRuntimeLBEventHandlerTask.level = ALL
oracle.ucp.jdbc.oracle.ONSSubscriberBase$Mocker.level = ALL
oracle.ucp.jdbc.oracle.ONSSubscriberBase.level = ALL
oracle.ucp.jdbc.oracle.OracleConnectionAffinityContext.level = ALL
oracle.ucp.jdbc.oracle.OracleConnectionConnectionPool.level = ALL
oracle.ucp.jdbc.oracle.OracleConnectionPoolDataSourceConnectionFactoryAdapter.level = ALL
oracle.ucp.jdbc.oracle.OracleDataSourceConnectionFactoryAdapter.level = ALL
oracle.ucp.jdbc.oracle.OracleDriverConnectionFactoryAdapter.level = ALL
oracle.ucp.jdbc.oracle.OracleFailoverEvent.level = ALL
oracle.ucp.jdbc.oracle.OracleFailoverEventImpl.level = ALL
oracle.ucp.jdbc.oracle.OracleFailoverEventNotification.level = ALL
oracle.ucp.jdbc.oracle.OracleFailoverEventSubscriber.level = ALL
oracle.ucp.jdbc.oracle.OracleFailoverablePooledConnection.level = ALL
oracle.ucp.jdbc.oracle.OracleGravitateConnectionPoolTask.level = ALL
oracle.ucp.jdbc.oracle.OracleJDBCConnectionPool.level = ALL
oracle.ucp.jdbc.oracle.OracleJDBCConnectionPoolStatistics.level = ALL
oracle.ucp.jdbc.oracle.OracleJDBCConnectionPoolStatisticsImpl.level = ALL
oracle.ucp.jdbc.oracle.OracleJDBCConnectionRetrievalInfo.level = ALL
oracle.ucp.jdbc.oracle.OracleLoadBalancingEvent$InstanceStatus.level = ALL
oracle.ucp.jdbc.oracle.OracleLoadBalancingEvent.level = ALL
oracle.ucp.jdbc.oracle.OraclePooledConnectionConnectionPool.level = ALL
oracle.ucp.jdbc.oracle.OracleReplayableConnectionConnectionPool.level = ALL
oracle.ucp.jdbc.oracle.OracleUniversalPooledConnection$InvocationVector.level = ALL
oracle.ucp.jdbc.oracle.OracleUniversalPooledConnection.level = ALL
oracle.ucp.jdbc.oracle.OracleXAConnectionConnectionPool.level = ALL
oracle.ucp.jdbc.oracle.OracleXADataSourceConnectionFactoryAdapter.level = ALL
oracle.ucp.jdbc.oracle.RACAffinityContext$AffinityType.level = ALL
oracle.ucp.jdbc.oracle.RACAffinityContext.level = ALL
oracle.ucp.jdbc.oracle.RACAvailableConnections.level = ALL
oracle.ucp.jdbc.oracle.RACCallback.level = ALL
oracle.ucp.jdbc.oracle.RACCallbackGuard.level = ALL
oracle.ucp.jdbc.oracle.RACInstance.level = ALL
oracle.ucp.jdbc.oracle.RACInstanceImpl.level = ALL
oracle.ucp.jdbc.oracle.RACManager.level = ALL
oracle.ucp.jdbc.oracle.RACManagerFactory.level = ALL
oracle.ucp.jdbc.oracle.RACManagerImpl$RACCallbackExtended.level = ALL
oracle.ucp.jdbc.oracle.RACManagerImpl.level = ALL
oracle.ucp.jdbc.oracle.ReplayDataSourceConnectionFactoryAdapter.level = ALL
oracle.ucp.jdbc.oracle.ReplayableRACManagerImpl.level = ALL
oracle.ucp.jdbc.oracle.Similarity.level = ALL
oracle.ucp.jdbc.oracle.SimilarityKey.level = ALL
oracle.ucp.jdbc.oracle.SimilarityList.level = ALL
oracle.ucp.jdbc.oracle.SimilarityMap$Pair.level = ALL
oracle.ucp.jdbc.oracle.SimilarityMap.level = ALL
oracle.ucp.jdbc.oracle.SimilaritySet.level = ALL
oracle.ucp.jdbc.oracle.SimpleSimilarity.level = ALL
oracle.ucp.jdbc.oracle.rlb.ConnectionsDispatcher.level = ALL
oracle.ucp.jdbc.oracle.rlb.FailoverInfo.level = ALL
oracle.ucp.jdbc.oracle.rlb.MetricsAccumulator$Frame.level = ALL
oracle.ucp.jdbc.oracle.rlb.MetricsAccumulator$InstanceStats.level = ALL
oracle.ucp.jdbc.oracle.rlb.MetricsAccumulator.level = ALL
oracle.ucp.jdbc.oracle.rlb.ONSRuntimeLoadBalancingEvent.level = ALL
oracle.ucp.jdbc.oracle.rlb.OracleDatabaseInstanceInfo$RebalancingState.level = ALL
oracle.ucp.jdbc.oracle.rlb.OracleDatabaseInstanceInfo.level = ALL
oracle.ucp.jdbc.oracle.rlb.OracleDatabaseInstanceInfoList$INSTANCE_CATEGORY_FOR_DATA_AFFINITY.level = ALL
oracle.ucp.jdbc.oracle.rlb.OracleDatabaseInstanceInfoList$Instances.level = ALL
oracle.ucp.jdbc.oracle.rlb.OracleDatabaseInstanceInfoList.level = ALL
oracle.ucp.jdbc.oracle.rlb.Policy.level = ALL
oracle.ucp.jdbc.oracle.rlb.PolicyBase.level = ALL
oracle.ucp.jdbc.oracle.rlb.PolicyImpl$SpecificStats.level = ALL
oracle.ucp.jdbc.oracle.rlb.PolicyImpl.level = ALL
oracle.ucp.jdbc.oracle.rlb.RLBInfo$Frame.level = ALL
oracle.ucp.jdbc.oracle.rlb.RLBInfo$InstanceStats.level = ALL
oracle.ucp.jdbc.oracle.rlb.RLBInfo.level = ALL
oracle.ucp.jdbc.proxy.CallableStatementProxyFactory.level = ALL
oracle.ucp.jdbc.proxy.ConnectionProxyFactory.level = ALL
oracle.ucp.jdbc.proxy.JDBCConnectionProxyFactory$SwitchTable.level = ALL
oracle.ucp.jdbc.proxy.JDBCConnectionProxyFactory.level = ALL
oracle.ucp.jdbc.proxy.PreparedStatementProxyFactory.level = ALL
oracle.ucp.jdbc.proxy.ResultSetProxyFactory.level = ALL
oracle.ucp.jdbc.proxy.StatementProxyFactory$SwitchTable.level = ALL
oracle.ucp.jdbc.proxy.StatementProxyFactory.level = ALL
oracle.ucp.jdbc.proxy.XAConnectionProxyFactory.level = ALL
oracle.ucp.util.Collections.level = ALL
oracle.ucp.util.ProlongedTask.level = ALL
oracle.ucp.util.RingBuffer.level = ALL
oracle.ucp.util.Task.level = ALL
oracle.ucp.util.TaskHandle.level = ALL
oracle.ucp.util.TaskManager.level = ALL
oracle.ucp.util.TaskManagerException.level = ALL
oracle.ucp.util.TimerHandle.level = ALL
oracle.ucp.util.TimerManager.level = ALL
oracle.ucp.util.TimerTask.level = ALL
oracle.ucp.util.UCPErrorHandler.level = ALL
oracle.ucp.util.UCPManifestReader.level = ALL
oracle.ucp.util.UCPTaskBase.level = ALL
oracle.ucp.util.UCPTaskManagerImpl.level = ALL
oracle.ucp.util.UCPTimerManagerImpl.level = ALL
oracle.ucp.util.UCPTimerTaskImpl.level = ALL
oracle.ucp.util.UniqueIdentifier.level = ALL
About these ads

2 Responses to “Playing with Application Continuity in RAC 12c”

  1. […] worth mentioning that Martin Bach recently published a post on Application Continuity where he also encountered a problem using the Thin-style Service Name […]

  2. […] long. The service definition has not changed from the first test with Application Continuity, see here for the srvctl syntax. So with all that said, here is what changed. I am using a new JSP […]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
Follow

Get every new post delivered to your Inbox.

Join 2,329 other followers

%d bloggers like this: