public class DefaultIndexedDataSourceCluster extends AbstractDataSourceCluster implements IndexedDataSourceCluster
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();
}
m_sizeROLE| Constructor and Description |
|---|
DefaultIndexedDataSourceCluster() |
| Modifier and Type | Method and Description |
|---|---|
java.sql.Connection |
getConnection()
Not supported in this component.
|
configure, dispose, getClusterSize, getConnectionForIndex, initialize, serviceenableLogging, getLogger, setupLogger, setupLogger, setupLoggerclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitgetClusterSize, getConnectionForIndexpublic java.sql.Connection getConnection()
throws java.sql.SQLException
getConnection in interface DataSourceComponentNoValidConnectionException - when there is no valid Connection wrapper
available in the classloader.NoAvailableConnectionException - when there are no more available
Connections in the pool.java.sql.SQLException