org.apache.avalon.excalibur.datasource.cluster
Class DefaultIndexedDataSourceCluster

java.lang.Object
  extended byorg.apache.avalon.framework.logger.AbstractLogEnabled
      extended byorg.apache.avalon.excalibur.datasource.cluster.AbstractDataSourceCluster
          extended byorg.apache.avalon.excalibur.datasource.cluster.DefaultIndexedDataSourceCluster
All Implemented Interfaces:
Component, Configurable, DataSourceComponent, Disposable, IndexedDataSourceCluster, Initializable, LogEnabled, Serviceable, ThreadSafe

public class DefaultIndexedDataSourceCluster
extends AbstractDataSourceCluster
implements IndexedDataSourceCluster

The DefaultIndexedDataSourceCluster requires that the user implement their own method of selecting which DataSource in the cluster to use for each connection request. Calls to getConnection() will throw an exception. Components which make use of this class must call the getConnectionForIndex(int index) method instead.

The Configuration for a 2 database cluster is like this:

   <datasources>
     <indexed-cluster name="mydb-cluster" size="2">
       <dbpool index="0">mydb-0</dbpool>
       <dbpool index="1">mydb-1</dbpool>
     </indexed-cluster>
   </datasources>
   <cluster-datasources>
     <jdbc name="mydb-0">
       <pool-controller min="1" max="10"/>
       <auto-commit>true</auto-commit>
       <driver>com.database.jdbc.JdbcDriver</driver>
       <dburl>jdbc:driver://host0/mydb</dburl>
       <user>username</user>
       <password>password</password>
     </jdbc>
     <jdbc name="mydb-1">
       <pool-controller min="1" max="10"/>
       <auto-commit>true</auto-commit>
       <driver>com.database.jdbc.JdbcDriver</driver>
       <dburl>jdbc:driver://host1/mydb</dburl>
       <user>username</user>
       <password>password</password>
     </jdbc>
   </cluster-datasources>
 
With the following roles declaration:
   <role name="org.apache.avalon.excalibur.datasource.DataSourceComponentSelector"
     shorthand="datasources"
     default-class="org.apache.avalon.excalibur.component.ExcaliburComponentSelector">
     <hint shorthand="jdbc" class="org.apache.avalon.excalibur.datasource.JdbcDataSource"/>
     <hint shorthand="j2ee" class="org.apache.avalon.excalibur.datasource.J2eeDataSource"/>
     <hint shorthand="indexed-cluster"
       class="org.apache.avalon.excalibur.datasource.cluster.DefaultIndexedDataSourceCluster"/>
   </role>
   <role name="org.apache.avalon.excalibur.datasource.DataSourceComponentClusterSelector"
       shorthand="cluster-datasources"
       default-class="org.apache.avalon.excalibur.component.ExcaliburComponentSelector">
     <hint shorthand="jdbc" class="org.apache.avalon.excalibur.datasource.JdbcDataSource"/>
     <hint shorthand="j2ee" class="org.apache.avalon.excalibur.datasource.J2eeDataSource"/>
   </role>
 
An indexed-cluster definition enforces that the configuration specify a size. This size must equal the number of datasources referenced as being members of the cluster. Any datasource can be a member of the cluster.

The indexed-cluster can be obtained in the same manner as a non-clustered datasource. The only difference is in how it is used. The IndexedDataSourceCluster requires that the caller specify the index of the cluster member to use when requesting a connection.

The following code demonstrates a change that can be made to database enabled components so that they will be able to work with both IndexedDataSourceCluster DataSources and regular DataSources.

old:

   Connection connection = m_dataSource.getConnection();
 
new:
   Connection connection;
   if ( m_dataSource instanceof IndexedDataSourceCluster )
   {
     connection = ((IndexedDataSourceCluster)m_dataSource).getConnectionForIndex( index );
   }
   else
   {
     connection = m_dataSource.getConnection();
   }
 

Since:
4.1
Version:
CVS $Revision: 1.4 $ $Date: 2004/02/28 11:47:20 $
Author:
Avalon Development Team

Field Summary
 
Fields inherited from class org.apache.avalon.excalibur.datasource.cluster.AbstractDataSourceCluster
m_size
 
Fields inherited from interface org.apache.avalon.excalibur.datasource.cluster.IndexedDataSourceCluster
ROLE
 
Constructor Summary
DefaultIndexedDataSourceCluster()
           
 
Method Summary
 java.sql.Connection getConnection()
          Not supported in this component.
 
Methods inherited from class org.apache.avalon.excalibur.datasource.cluster.AbstractDataSourceCluster
configure, dispose, getClusterSize, getConnectionForIndex, initialize, service
 
Methods inherited from class org.apache.avalon.framework.logger.AbstractLogEnabled
enableLogging, getLogger, setupLogger, setupLogger, setupLogger
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.apache.avalon.excalibur.datasource.cluster.IndexedDataSourceCluster
getClusterSize, getConnectionForIndex
 
Methods inherited from interface org.apache.avalon.framework.configuration.Configurable
configure
 

Constructor Detail

DefaultIndexedDataSourceCluster

public DefaultIndexedDataSourceCluster()
Method Detail

getConnection

public java.sql.Connection getConnection()
                                  throws java.sql.SQLException
Not supported in this component. Will throw a NoValidConnectionException.

Specified by:
getConnection in interface DataSourceComponent
Returns:
Connection a valid connection for you to use
Throws:
java.sql.SQLException


Copyright © 1997-2005 The Apache Software Foundation. All Rights Reserved.