Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB Class Reference

Inheritance diagram for org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB:

Inheritance graph
[legend]
Collaboration diagram for org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 ParallelDB (VirtualDatabase vdb) throws SQLException, NotCompliantMBeanException
ControllerResultSet execReadRequest (SelectRequest request, MetadataCache metadataCache) throws SQLException
ControllerResultSet execReadOnlyReadStoredProcedure (StoredProcedure proc, MetadataCache metadataCache) throws SQLException
ControllerResultSet execReadStoredProcedure (StoredProcedure proc, MetadataCache metadataCache) throws SQLException
int execWriteRequest (AbstractWriteRequest request) throws AllBackendsFailedException, SQLException
ControllerResultSet execWriteRequestWithKeys (AbstractWriteRequest request, MetadataCache metadataCache) throws AllBackendsFailedException, SQLException
int execWriteStoredProcedure (StoredProcedure proc) throws SQLException
void begin (TransactionMarkerMetaData tm) throws SQLException
void commit (TransactionMarkerMetaData tm) throws SQLException
void rollback (TransactionMarkerMetaData tm) throws SQLException
void enableBackend (DatabaseBackend db, boolean writeEnabled) throws SQLException
void disableBackend (DatabaseBackend db) throws SQLException
String getXmlImpl ()
abstract String getParallelDBXml ()
abstract DatabaseBackend chooseBackendForReadRequest (AbstractRequest request) throws SQLException
abstract DatabaseBackend chooseBackendForWriteRequest (AbstractWriteRequest request) throws SQLException

Detailed Description

These are generic functions for all ParallelDB load balancers.

Read and write queries are load balanced on the backends without any replication (assuming that the underlying parallel database takes care of data replication). The load balancers provide failover for reads and writes.

Author:
Emmanuel Cecchet

Jaco Swart

Version:
1.0

Definition at line 71 of file ParallelDB.java.


Constructor & Destructor Documentation

org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.ParallelDB VirtualDatabase  vdb  )  throws SQLException, NotCompliantMBeanException
 

Creates a new ParallelDB load balancer with NO_PARSING and a SingleDB RAIDb level.

Parameters:
vdb the virtual database this load balancer belongs to.
Exceptions:
SQLException if an error occurs
NotCompliantMBeanException if the MBean is not JMX compliant

Definition at line 84 of file ParallelDB.java.

00086   {
00087     super(vdb, RAIDbLevels.SingleDB, ParsingGranularities.NO_PARSING);
00088   }


Member Function Documentation

void org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.begin TransactionMarkerMetaData  tm  )  throws SQLException [virtual]
 

See also:
org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.begin(org.objectweb.cjdbc.controller.requestmanager.TransactionMarkerMetaData)

Implements org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.

Definition at line 968 of file ParallelDB.java.

References org.objectweb.cjdbc.controller.backend.DatabaseBackend.startTransaction().

00969   {
00970     Long lTid = new Long(tm.getTransactionId());
00971     if (backendPerTransactionId.containsKey(lTid))
00972       throw new SQLException(Translate.get(
00973           "loadbalancer.transaction.already.started", lTid.toString()));
00974 
00975     DatabaseBackend backend = chooseBackendForReadRequest(new UnknownRequest(
00976         "begin", false, 0, "\n"));
00977     backendPerTransactionId.put(lTid, backend);
00978     backend.startTransaction(lTid);
00979   }

abstract DatabaseBackend org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.chooseBackendForReadRequest AbstractRequest  request  )  throws SQLException [pure virtual]
 

Choose a backend using the implementation specific load balancing algorithm for read request execution.

Parameters:
request request to execute
Returns:
the chosen backend
Exceptions:
SQLException if an error occurs

Implemented in org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB_LPRF, and org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB_RR.

Referenced by org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.execReadRequest().

abstract DatabaseBackend org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.chooseBackendForWriteRequest AbstractWriteRequest  request  )  throws SQLException [pure virtual]
 

Choose a backend using the implementation specific load balancing algorithm for write request execution.

Parameters:
request request to execute
Returns:
the chosen backend
Exceptions:
SQLException if an error occurs

Implemented in org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB_LPRF, and org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB_RR.

void org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.commit TransactionMarkerMetaData  tm  )  throws SQLException [virtual]
 

See also:
org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.commit(org.objectweb.cjdbc.controller.requestmanager.TransactionMarkerMetaData)

Implements org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.

Definition at line 984 of file ParallelDB.java.

References org.objectweb.cjdbc.controller.backend.DatabaseBackend.getConnectionManager(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.getName(), org.objectweb.cjdbc.controller.connection.AbstractConnectionManager.retrieveConnection(), and org.objectweb.cjdbc.controller.backend.DatabaseBackend.stopTransaction().

00985   {
00986     long tid = tm.getTransactionId();
00987     Long lTid = new Long(tid);
00988     DatabaseBackend db = (DatabaseBackend) backendPerTransactionId.remove(lTid);
00989 
00990     AbstractConnectionManager cm = db.getConnectionManager(tm.getLogin());
00991     Connection c = cm.retrieveConnection(tid);
00992 
00993     // Sanity check
00994     if (c == null)
00995     { // Bad connection
00996       db.stopTransaction(lTid);
00997 
00998       throw new SQLException(Translate.get(
00999           "loadbalancer.unable.retrieve.connection", new String[]{
01000               String.valueOf(tid), db.getName()}));
01001     }
01002 
01003     // Execute Query
01004     try
01005     {
01006       c.commit();
01007       c.setAutoCommit(true);
01008     }
01009     catch (Exception e)
01010     {
01011       String msg = Translate.get("loadbalancer.commit.failed", new String[]{
01012           String.valueOf(tid), db.getName(), e.getMessage()});
01013       logger.error(msg);
01014       throw new SQLException(msg);
01015     }
01016     finally
01017     {
01018       cm.releaseConnection(tid);
01019       db.stopTransaction(lTid);
01020     }
01021   }

void org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.disableBackend DatabaseBackend  db  )  throws SQLException [virtual]
 

Disables a backend that was previously enabled. Asks the corresponding connection manager to finalize the connections if needed.

No sanity checks are performed by this function.

Parameters:
db the database backend to disable
Exceptions:
SQLException if an error occurs

Implements org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.

Definition at line 1095 of file ParallelDB.java.

References org.objectweb.cjdbc.controller.backend.DatabaseBackend.disable(), and org.objectweb.cjdbc.controller.backend.DatabaseBackend.finalizeConnections().

01096   {
01097     logger.info(Translate.get("loadbalancer.backend.disabling", db.getName()));
01098     db.disable();
01099     if (db.isInitialized())
01100       db.finalizeConnections();
01101   }

void org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.enableBackend DatabaseBackend  db,
boolean  writeEnabled
throws SQLException [virtual]
 

Enables a backend that was previously disabled. Asks the corresponding connection manager to initialize the connections if needed.

No sanity checks are performed by this function.

Parameters:
db the database backend to enable
writeEnabled True if the backend must be enabled for writes
Exceptions:
SQLException if an error occurs

Implements org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.

Definition at line 1075 of file ParallelDB.java.

References org.objectweb.cjdbc.controller.backend.DatabaseBackend.enableRead(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.enableWrite(), and org.objectweb.cjdbc.controller.backend.DatabaseBackend.initializeConnections().

01077   {
01078     logger.info(Translate.get("loadbalancer.backend.enabling", db.getName()));
01079     if (!db.isInitialized())
01080       db.initializeConnections();
01081     db.enableRead();
01082     if (writeEnabled)
01083       db.enableWrite();
01084   }

ControllerResultSet org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.execReadOnlyReadStoredProcedure StoredProcedure  proc,
MetadataCache  metadataCache
throws SQLException [virtual]
 

See also:
org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.execReadOnlyReadStoredProcedure(StoredProcedure, MetadataCache)

Implements org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.

Definition at line 144 of file ParallelDB.java.

00146   {
00147     return execReadStoredProcedure(proc, metadataCache);
00148   }

ControllerResultSet org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.execReadRequest SelectRequest  request,
MetadataCache  metadataCache
throws SQLException [virtual]
 

See also:
org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.execReadRequest(SelectRequest, MetadataCache)

Implements org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.

Definition at line 94 of file ParallelDB.java.

References org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.chooseBackendForReadRequest(), org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.getSQLShortFormLength(), org.objectweb.cjdbc.common.log.Trace.info(), and org.objectweb.cjdbc.common.log.Trace.isInfoEnabled().

00096   {
00097     DatabaseBackend backend;
00098     if (request.isAutoCommit())
00099       backend = chooseBackendForReadRequest(request);
00100     else
00101       backend = (DatabaseBackend) backendPerTransactionId.get(new Long(request
00102           .getTransactionId()));
00103 
00104     if (backend == null)
00105       throw new SQLException(Translate.get(
00106           "loadbalancer.execute.no.backend.found", request.getSQLShortForm(vdb
00107               .getSQLShortFormLength())));
00108 
00109     ControllerResultSet rs = null;
00110     // Execute the request on the chosen backend
00111     try
00112     {
00113       rs = executeReadRequestOnBackend(request, backend, metadataCache);
00114     }
00115     catch (UnreachableBackendException urbe)
00116     {
00117       // Try to execute query on different backend
00118       return execReadRequest(request, metadataCache);
00119     }
00120     catch (SQLException se)
00121     {
00122       String msg = Translate.get("loadbalancer.request.failed", new String[]{
00123           String.valueOf(request.getId()), se.getMessage()});
00124       if (logger.isInfoEnabled())
00125         logger.info(msg);
00126       throw new SQLException(msg);
00127     }
00128     catch (RuntimeException e)
00129     {
00130       String msg = Translate.get("loadbalancer.request.failed.on.backend",
00131           new String[]{request.getSQLShortForm(vdb.getSQLShortFormLength()),
00132               backend.getName(), e.getMessage()});
00133       logger.error(msg, e);
00134       throw new SQLException(msg);
00135     }
00136 
00137     return rs;
00138   }

ControllerResultSet org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.execReadStoredProcedure StoredProcedure  proc,
MetadataCache  metadataCache
throws SQLException [virtual]
 

See also:
org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.execReadStoredProcedure(StoredProcedure, MetadataCache)

Implements org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.

Definition at line 154 of file ParallelDB.java.

00156   {
00157     DatabaseBackend backend;
00158     if (proc.isAutoCommit())
00159       backend = chooseBackendForReadRequest(proc);
00160     else
00161       backend = (DatabaseBackend) backendPerTransactionId.get(new Long(proc
00162           .getTransactionId()));
00163 
00164     if (backend == null)
00165       throw new SQLException(Translate.get(
00166           "loadbalancer.storedprocedure.no.backend.found", proc
00167               .getSQLShortForm(vdb.getSQLShortFormLength())));
00168 
00169     ControllerResultSet rs = null;
00170     // Execute the request on the chosen backend
00171     try
00172     {
00173       rs = executeReadStoredProcedureOnBackend(proc, backend, metadataCache);
00174     }
00175     catch (UnreachableBackendException urbe)
00176     {
00177       // Try to execute query on different backend
00178       return execReadStoredProcedure(proc, metadataCache);
00179     }
00180     catch (SQLException se)
00181     {
00182       String msg = Translate.get("loadbalancer.storedprocedure.failed",
00183           new String[]{String.valueOf(proc.getId()), se.getMessage()});
00184       if (logger.isInfoEnabled())
00185         logger.info(msg);
00186       throw new SQLException(msg);
00187     }
00188     catch (RuntimeException e)
00189     {
00190       String msg = Translate.get(
00191           "loadbalancer.storedprocedure.failed.on.backend", new String[]{
00192               proc.getSQLShortForm(vdb.getSQLShortFormLength()),
00193               backend.getName(), e.getMessage()});
00194       logger.error(msg, e);
00195       throw new SQLException(msg);
00196     }
00197 
00198     return rs;
00199   }

int org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.execWriteRequest AbstractWriteRequest  request  )  throws AllBackendsFailedException, SQLException [virtual]
 

See also:
org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.execWriteRequest(org.objectweb.cjdbc.common.sql.AbstractWriteRequest)

Implements org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.

Definition at line 204 of file ParallelDB.java.

00206   {
00207     DatabaseBackend backend;
00208     if (request.isAutoCommit())
00209       backend = chooseBackendForWriteRequest(request);
00210     else
00211       backend = (DatabaseBackend) backendPerTransactionId.get(new Long(request
00212           .getTransactionId()));
00213 
00214     if (backend == null)
00215       throw new SQLException(Translate.get(
00216           "loadbalancer.execute.no.backend.found", request.getSQLShortForm(vdb
00217               .getSQLShortFormLength())));
00218 
00219     int result;
00220     // Execute the request on the chosen backend
00221     try
00222     {
00223       result = executeWriteRequestOnBackend(request, backend);
00224     }
00225     catch (UnreachableBackendException urbe)
00226     {
00227       // Try to execute query on different backend
00228       return execWriteRequest(request);
00229     }
00230     catch (SQLException se)
00231     {
00232       String msg = Translate.get("loadbalancer.request.failed", new String[]{
00233           String.valueOf(request.getId()), se.getMessage()});
00234       if (logger.isInfoEnabled())
00235         logger.info(msg);
00236       throw new SQLException(msg);
00237     }
00238     catch (RuntimeException e)
00239     {
00240       String msg = Translate.get("loadbalancer.request.failed.on.backend",
00241           new String[]{request.getSQLShortForm(vdb.getSQLShortFormLength()),
00242               backend.getName(), e.getMessage()});
00243       logger.error(msg, e);
00244       throw new SQLException(msg);
00245     }
00246 
00247     return result;
00248   }

ControllerResultSet org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.execWriteRequestWithKeys AbstractWriteRequest  request,
MetadataCache  metadataCache
throws AllBackendsFailedException, SQLException [virtual]
 

See also:
org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.execWriteRequestWithKeys(AbstractWriteRequest, MetadataCache)

Implements org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.

Definition at line 254 of file ParallelDB.java.

00257   {
00258     DatabaseBackend backend;
00259     if (request.isAutoCommit())
00260       backend = chooseBackendForWriteRequest(request);
00261     else
00262       backend = (DatabaseBackend) backendPerTransactionId.get(new Long(request
00263           .getTransactionId()));
00264 
00265     if (backend == null)
00266       throw new SQLException(Translate.get(
00267           "loadbalancer.execute.no.backend.found", request.getSQLShortForm(vdb
00268               .getSQLShortFormLength())));
00269 
00270     ControllerResultSet rs;
00271     // Execute the request on the chosen backend
00272     try
00273     {
00274       rs = executeWriteRequestWithKeysOnBackend(request, backend, metadataCache);
00275     }
00276     catch (UnreachableBackendException urbe)
00277     {
00278       // Try to execute query on different backend
00279       return execWriteRequestWithKeys(request, metadataCache);
00280     }
00281     catch (SQLException se)
00282     {
00283       String msg = Translate.get("loadbalancer.request.failed", new String[]{
00284           String.valueOf(request.getId()), se.getMessage()});
00285       if (logger.isInfoEnabled())
00286         logger.info(msg);
00287       throw new SQLException(msg);
00288     }
00289     catch (RuntimeException e)
00290     {
00291       String msg = Translate.get("loadbalancer.request.failed.on.backend",
00292           new String[]{request.getSQLShortForm(vdb.getSQLShortFormLength()),
00293               backend.getName(), e.getMessage()});
00294       logger.error(msg, e);
00295       throw new SQLException(msg);
00296     }
00297 
00298     return rs;
00299   }

int org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.execWriteStoredProcedure StoredProcedure  proc  )  throws SQLException [virtual]
 

See also:
org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.execWriteStoredProcedure(org.objectweb.cjdbc.common.sql.StoredProcedure)

Implements org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.

Definition at line 304 of file ParallelDB.java.

00305   {
00306     DatabaseBackend backend;
00307     if (proc.isAutoCommit())
00308       backend = chooseBackendForReadRequest(proc);
00309     else
00310       backend = (DatabaseBackend) backendPerTransactionId.get(new Long(proc
00311           .getTransactionId()));
00312 
00313     if (backend == null)
00314       throw new SQLException(Translate.get(
00315           "loadbalancer.storedprocedure.no.backend.found", proc
00316               .getSQLShortForm(vdb.getSQLShortFormLength())));
00317 
00318     int result;
00319     // Execute the request on the chosen backend
00320     try
00321     {
00322       result = executeWriteStoredProcedureOnBackend(proc, backend);
00323     }
00324     catch (UnreachableBackendException urbe)
00325     {
00326       // Try to execute query on different backend
00327       return execWriteStoredProcedure(proc);
00328     }
00329     catch (SQLException se)
00330     {
00331       String msg = Translate.get("loadbalancer.storedprocedure.failed",
00332           new String[]{String.valueOf(proc.getId()), se.getMessage()});
00333       if (logger.isInfoEnabled())
00334         logger.info(msg);
00335       throw new SQLException(msg);
00336     }
00337     catch (RuntimeException e)
00338     {
00339       String msg = Translate.get(
00340           "loadbalancer.storedprocedure.failed.on.backend", new String[]{
00341               proc.getSQLShortForm(vdb.getSQLShortFormLength()),
00342               backend.getName(), e.getMessage()});
00343       logger.error(msg, e);
00344       throw new SQLException(msg);
00345     }
00346 
00347     return result;
00348   }

abstract String org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.getParallelDBXml  )  [pure virtual]
 

Return the XML tags of the ParallelDB load balancer implementation.

Returns:
content of ParallelDB xml

Implemented in org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB_LPRF, and org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB_RR.

String org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.getXmlImpl  )  [virtual]
 

See also:
org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.getXmlImpl

Implements org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.

Definition at line 1106 of file ParallelDB.java.

References org.objectweb.cjdbc.controller.backend.DatabaseBackend.toString().

01107   {
01108     StringBuffer info = new StringBuffer();
01109     info.append("<" + DatabasesXmlTags.ELT_ParallelDB + ">");
01110     info.append(getParallelDBXml());
01111     info.append("</" + DatabasesXmlTags.ELT_ParallelDB + ">");
01112     return info.toString();
01113   }

void org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.rollback TransactionMarkerMetaData  tm  )  throws SQLException [virtual]
 

See also:
org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.rollback(org.objectweb.cjdbc.controller.requestmanager.TransactionMarkerMetaData)

Implements org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.

Definition at line 1026 of file ParallelDB.java.

References org.objectweb.cjdbc.controller.backend.DatabaseBackend.getConnectionManager(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.getName(), org.objectweb.cjdbc.controller.connection.AbstractConnectionManager.retrieveConnection(), and org.objectweb.cjdbc.controller.backend.DatabaseBackend.stopTransaction().

01027   {
01028     long tid = tm.getTransactionId();
01029     Long lTid = new Long(tid);
01030     DatabaseBackend db = (DatabaseBackend) backendPerTransactionId.remove(lTid);
01031 
01032     AbstractConnectionManager cm = db.getConnectionManager(tm.getLogin());
01033     Connection c = cm.retrieveConnection(tid);
01034 
01035     // Sanity check
01036     if (c == null)
01037     { // Bad connection
01038       db.stopTransaction(lTid);
01039 
01040       throw new SQLException(Translate.get(
01041           "loadbalancer.unable.retrieve.connection", new String[]{
01042               String.valueOf(tid), db.getName()}));
01043     }
01044 
01045     // Execute Query
01046     try
01047     {
01048       c.rollback();
01049       c.setAutoCommit(true);
01050     }
01051     catch (Exception e)
01052     {
01053       String msg = Translate.get("loadbalancer.rollback.failed", new String[]{
01054           String.valueOf(tid), db.getName(), e.getMessage()});
01055       logger.error(msg);
01056       throw new SQLException(msg);
01057     }
01058     finally
01059     {
01060       cm.releaseConnection(tid);
01061       db.stopTransaction(lTid);
01062     }
01063   }


The documentation for this class was generated from the following file:
Generated on Mon Apr 11 22:03:55 2005 for C-JDBC by  doxygen 1.3.9.1