public class DefaultHashedDataSourceCluster extends AbstractDataSourceCluster implements HashedDataSourceCluster
This form of Clustering is useful in cases where data can be reliably accessed in a repeatable manner. For example a web site's visitor information could be accessed by using a String containing the visitor's username as a hashObject. This would allow visitor information to be spread across several database servers.
The Configuration for a 2 database cluster is like this:
<datasources>
<hashed-cluster name="mydb-cluster" size="2">
<dbpool index="0">mydb-0</dbpool>
<dbpool index="1">mydb-1</dbpool>
</hashed-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="hashed-cluster"
class="org.apache.avalon.excalibur.datasource.cluster.DefaultHashedDataSourceCluster"/>
</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>
A hashed-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 hashed-cluster can be obtained in the same manner as a non-clustered datasource. The only difference is in how it is used. The HashedDataSourceCluster requires that the caller provide an object or a hashCode 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 HashedDataSourceCluster DataSources and regular DataSources.
old:
Connection connection = m_dataSource.getConnection();new:
Connection connection;
if ( m_dataSource instanceof HashedDataSourceCluster )
{
connection = ((HashedDataSourceCluster)m_dataSource).getConnectionForHashObject( hashObject );
}
else
{
connection = m_dataSource.getConnection();
}
m_sizeROLE| Constructor and Description |
|---|
DefaultHashedDataSourceCluster() |
| Modifier and Type | Method and Description |
|---|---|
java.sql.Connection |
getConnection()
Not supported in this component.
|
java.sql.Connection |
getConnectionForHashCode(int hashCode)
Gets a Connection to a database given a hash code.
|
java.sql.Connection |
getConnectionForHashObject(java.lang.Object hashObject)
Gets a Connection to a database given a hash object.
|
int |
getIndexForHashCode(int hashCode)
Gets the index which will be resolved for a given hashCode.
|
int |
getIndexForHashObject(java.lang.Object hashObject)
Gets the index which will be resolved for a given hashCode.
|
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.SQLExceptionpublic java.sql.Connection getConnectionForHashObject(java.lang.Object hashObject)
throws java.sql.SQLException
getConnectionForHashObject in interface HashedDataSourceClusterhashObject - Object whose hashCode will be used to select which of the Clusted
DataSources will be provide a Connection.NoValidConnectionException - when there is no valid Connection wrapper
available in the classloader or when the index is not valid.NoValidConnectionException - when there are no more available
Connections in the pool.NoAvailableConnectionException - when there are no more available
Connections in the pool.java.sql.SQLExceptionpublic java.sql.Connection getConnectionForHashCode(int hashCode)
throws java.sql.SQLException
getConnectionForHashCode in interface HashedDataSourceClusterhashCode - HashCode which will be used to select which of the Clusted
DataSources will be provide a Connection.NoValidConnectionException - when there is no valid Connection wrapper
available in the classloader or when the index is not valid.NoValidConnectionException - when there are no more available
Connections in the pool.NoAvailableConnectionException - when there are no more available
Connections in the pool.java.sql.SQLExceptionpublic int getIndexForHashObject(java.lang.Object hashObject)
Subclasses can override this method to get different behavior.
By default the index = getIndexForHashCode( hashObject.hashCode() )
getIndexForHashObject in interface HashedDataSourceClusterhashObject - Object whose hashCode will be used to select which of the Clusted
DataSources will be provide a Connection.public int getIndexForHashCode(int hashCode)
Subclasses can override this method to get different behavior.
By default the index = hashCode % getClusterSize()
getIndexForHashCode in interface HashedDataSourceClusterhashCode - HashCode which will be used to select which of the Clusted
DataSources will be provide a Connection.