クラス org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTask

org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTaskに対する継承グラフ

Inheritance graph
[凡例]
org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTaskのコラボレーション図

Collaboration graph
[凡例]
すべてのメンバ一覧

説明

Executes a StoredProcedure call that returns a ResultSet.

作者:
Emmanuel Cecchet
バージョン:
1.0

ReadStoredProcedureTask.java44 行で定義されています。

Public メソッド

 ReadStoredProcedureTask (int nbToComplete, int totalNb, StoredProcedure proc)
void execute (BackendWorkerThread backendThread) throws SQLException
ResultSet getResult ()
String toString ()
boolean hasTid ()
synchronized void notifySuccess ()
synchronized boolean notifyFailure (BackendWorkerThread backendThread, long timeout, SQLException e) throws SQLException
ArrayList getExceptions ()
int getFailed ()
int getNbToComplete ()
int getSuccess ()
int getTotalNb ()
void setTotalNb (int totalNb)
void setHasTid (boolean hasTid)

Private 変数

StoredProcedure proc
ResultSet result


コンストラクタとデストラクタ

org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTask.ReadStoredProcedureTask int  nbToComplete,
int  totalNb,
StoredProcedure  proc
 

Creates a new ReadStoredProcedureTask.

引数:
nbToComplete number of threads that must succeed before returning
totalNb total number of threads
proc the StoredProcedure to call

ReadStoredProcedureTask.java56 行で定義されています。

00058   {
00059     super(nbToComplete, totalNb);
00060     this.proc = proc;
00061   }


メソッド

void org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTask.execute BackendWorkerThread  backendThread  )  throws SQLException [virtual]
 

Call a stored procedure that returns a ResultSet on the given backend thread.

引数:
backendThread the backend thread that will execute the task
例外:
SQLException if an error occurs

org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTaskに実装されています.

ReadStoredProcedureTask.java70 行で定義されています。

参照先 org.objectweb.cjdbc.controller.backend.DatabaseBackend.disable(), org.objectweb.cjdbc.controller.connection.AbstractConnectionManager.getConnection(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.getConnectionManager(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.getDriverCompliance(), org.objectweb.cjdbc.common.sql.AbstractRequest.getLogin(), org.objectweb.cjdbc.common.sql.AbstractRequest.getMaxRows(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.getName(), org.objectweb.cjdbc.common.sql.AbstractRequest.getSQL(), org.objectweb.cjdbc.common.sql.AbstractRequest.getSQLShortForm(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.getSQLShortFormLength(), org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.getSuccess(), org.objectweb.cjdbc.common.sql.AbstractRequest.getTimeout(), org.objectweb.cjdbc.common.sql.AbstractRequest.getTransactionId(), org.objectweb.cjdbc.common.sql.AbstractRequest.isAutoCommit, org.objectweb.cjdbc.controller.backend.DatabaseBackend.isStartedTransaction(), org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.notifyFailure(), org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.notifySuccess(), org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTask.proc, org.objectweb.cjdbc.controller.connection.AbstractConnectionManager.releaseConnection(), org.objectweb.cjdbc.controller.connection.AbstractConnectionManager.retrieveConnection(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.startTransaction(), org.objectweb.cjdbc.controller.backend.DriverCompliance.supportSetMaxRows, と org.objectweb.cjdbc.controller.backend.DriverCompliance.supportSetQueryTimeout.

00071   {
00072     DatabaseBackend backend = backendThread.getBackend();
00073 
00074     AbstractConnectionManager cm = backend
00075         .getConnectionManager(proc.getLogin());
00076 
00077     if (proc.isAutoCommit())
00078     { // Use a connection just for this request
00079       Connection c = null;
00080       try
00081       {
00082         c = cm.getConnection();
00083       }
00084       catch (UnreachableBackendException e1)
00085       {
00086         backendThread.getLogger().error(
00087             "Disabling backend " + backend.getName()
00088                 + " because it is no more reachable.");
00089         backend.disable();
00090         throw new SQLException("Backend " + backend.getName()
00091             + " is no more reachable.");
00092       }
00093 
00094       // Sanity check
00095       if (c == null)
00096       {
00097         SQLException se = new SQLException("No more connections");
00098         try
00099         { // All backends failed, just ignore
00100           if (!notifyFailure(backendThread, (long) proc.getTimeout() * 1000, se))
00101             return;
00102         }
00103         catch (SQLException ignore)
00104         {
00105         }
00106         // Disable this backend (it is no more in sync) by killing the backend
00107         // thread
00108         backendThread.kill();
00109         String msg = "Stored procedure '"
00110             + proc.getSQLShortForm(backend.getSQLShortFormLength())
00111             + "' failed on backend " + backend.getName() + " but "
00112             + getSuccess() + " succeeded (" + se + ")";
00113         backendThread.getLogger().error(msg);
00114         throw new SQLException(msg);
00115       }
00116 
00117       // Execute Query
00118       try
00119       {
00120         CallableStatement cs = c.prepareCall(proc.getSQL());
00121         if (backend.getDriverCompliance().supportSetQueryTimeout())
00122           cs.setQueryTimeout(proc.getTimeout());
00123         if ((proc.getMaxRows() > 0)
00124             && backend.getDriverCompliance().supportSetMaxRows())
00125           cs.setMaxRows(proc.getMaxRows());
00126         result = cs.executeQuery();
00127 
00128         // Warning! No way to detect if schema has been modified unless
00129         // we ask the backend again using DatabaseMetaData.getTables().
00130         // FIXME!
00131       }
00132       catch (SQLException e)
00133       {
00134         try
00135         { // All backends failed, just ignore
00136           if (!notifyFailure(backendThread, (long) proc.getTimeout() * 1000, e))
00137             return;
00138         }
00139         catch (SQLException ignore)
00140         {
00141         }
00142         // Disable this backend (it is no more in sync) by killing the backend
00143         // thread
00144         backendThread.kill();
00145         String msg = "Stored procedure '"
00146             + proc.getSQLShortForm(backend.getSQLShortFormLength())
00147             + "' failed on backend " + backend.getName() + " but "
00148             + getSuccess() + " succeeded (" + e + ")";
00149         backendThread.getLogger().error(msg);
00150         throw new SQLException(msg);
00151       }
00152       finally
00153       {
00154         cm.releaseConnection(c);
00155       }
00156     }
00157     else
00158     { // Re-use the connection used by this transaction
00159       Connection c;
00160       long tid = proc.getTransactionId();
00161       Long lTid = new Long(tid);
00162 
00163       if (!backend.isStartedTransaction(lTid))
00164       { // Transaction has not been started yet, this is a lazy begin
00165         try
00166         {
00167           c = cm.getConnection(tid);
00168         }
00169         catch (UnreachableBackendException e1)
00170         {
00171           backendThread.getLogger().error(
00172               "Disabling backend " + backend.getName()
00173                   + " because it is no more reachable.");
00174           backend.disable();
00175           throw new SQLException("Backend " + backend.getName()
00176               + " is no more reachable.");
00177         }
00178 
00179         // Sanity check
00180         if (c == null)
00181         { // Bad connection
00182           SQLException se = new SQLException(
00183               "Unable to get connection for transaction " + tid);
00184           try
00185           { // All backends failed, just ignore
00186             if (!notifyFailure(backendThread, (long) proc.getTimeout() * 1000,
00187                 se))
00188               return;
00189           }
00190           catch (SQLException ignore)
00191           {
00192           }
00193           // Disable this backend (it is no more in sync) by killing the
00194           // backend thread
00195           backendThread.kill();
00196           String msg = "Stored procedure '"
00197               + proc.getSQLShortForm(backend.getSQLShortFormLength())
00198               + "' failed on backend " + backend.getName() + " but "
00199               + getSuccess() + " succeeded (" + se + ")";
00200           backendThread.getLogger().error(msg);
00201           throw new SQLException(msg);
00202         }
00203 
00204         // begin transaction
00205         backend.startTransaction(lTid);
00206         c.setAutoCommit(false);
00207       }
00208       else
00209       { // Transaction has already been started, retrieve connection
00210         c = cm.retrieveConnection(tid);
00211 
00212         // Sanity check
00213         if (c == null)
00214         { // Bad connection
00215           SQLException se = new SQLException(
00216               "Unable to retrieve connection for transaction " + tid);
00217           try
00218           { // All backends failed, just ignore
00219             if (!notifyFailure(backendThread, (long) proc.getTimeout() * 1000,
00220                 se))
00221               return;
00222           }
00223           catch (SQLException ignore)
00224           {
00225           }
00226           // Disable this backend (it is no more in sync) by killing the
00227           // backend thread
00228           backendThread.kill();
00229           String msg = "Stored procedure '"
00230               + proc.getSQLShortForm(backend.getSQLShortFormLength())
00231               + "' failed on backend " + backend.getName() + " but "
00232               + getSuccess() + " succeeded (" + se + ")";
00233           backendThread.getLogger().error(msg);
00234           throw new SQLException(msg);
00235         }
00236       }
00237 
00238       // Execute Query
00239       try
00240       {
00241         CallableStatement cs = c.prepareCall(proc.getSQL());
00242         if (backend.getDriverCompliance().supportSetQueryTimeout())
00243           cs.setQueryTimeout(proc.getTimeout());
00244         if ((proc.getMaxRows() > 0)
00245             && backend.getDriverCompliance().supportSetMaxRows())
00246           cs.setMaxRows(proc.getMaxRows());
00247         result = cs.executeQuery();
00248 
00249         // Warning! No way to detect if schema has been modified unless
00250         // we ask the backend again using DatabaseMetaData.getTables().
00251 
00252       }
00253       catch (SQLException e)
00254       {
00255         try
00256         { // All backends failed, just ignore
00257           if (!notifyFailure(backendThread, (long) proc.getTimeout() * 1000, e))
00258             return;
00259         }
00260         catch (SQLException ignore)
00261         {
00262         }
00263         // Disable this backend (it is no more in sync) by killing the backend
00264         // thread
00265         backendThread.kill();
00266         String msg = "Stored procedure '"
00267             + proc.getSQLShortForm(backend.getSQLShortFormLength())
00268             + "' failed on backend " + backend.getName() + " but "
00269             + getSuccess() + " succeeded (" + e + ")";
00270         backendThread.getLogger().error(msg);
00271         throw new SQLException(msg);
00272       }
00273     }
00274     notifySuccess();
00275   }

ArrayList org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.getExceptions  )  [inherited]
 

Returns the exceptions lists.

戻り値:
an ArrayList

AbstractTask.java167 行で定義されています。

参照先 org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.exceptions.

00168   {
00169     return exceptions;
00170   }

int org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.getFailed  )  [inherited]
 

Returns the failed.

戻り値:
an int value

AbstractTask.java177 行で定義されています。

参照先 org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.failed.

参照元 org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.callStoredProcedure(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.callStoredProcedure(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.commit(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.commit(), org.objectweb.cjdbc.controller.loadbalancer.raidb0.RAIDb0.commit(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.execWriteRequest(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.rollback(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.rollback(), と org.objectweb.cjdbc.controller.loadbalancer.raidb0.RAIDb0.rollback().

00178   {
00179     return failed;
00180   }

int org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.getNbToComplete  )  [inherited]
 

Returns the number of threads that must succeed before returning.

戻り値:
an int value

AbstractTask.java187 行で定義されています。

参照先 org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.nbToComplete.

00188   {
00189     return nbToComplete;
00190   }

ResultSet org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTask.getResult  ) 
 

Returns the result.

戻り値:
a ResultSet

ReadStoredProcedureTask.java282 行で定義されています。

参照元 org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.execReadStoredProcedure(), と org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.execReadStoredProcedure().

00283   {
00284     return result;
00285   }

int org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.getSuccess  )  [inherited]
 

Returns the success.

戻り値:
an int value

AbstractTask.java197 行で定義されています。

参照先 org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.success.

参照元 org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.callStoredProcedure(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.callStoredProcedure(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.commit(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.commit(), org.objectweb.cjdbc.controller.loadbalancer.raidb0.RAIDb0.commit(), org.objectweb.cjdbc.controller.loadbalancer.tasks.WriteStoredProcedureTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.WriteRequestWithKeysTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.WriteRequestTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.RollbackTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.CommitTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.execWriteRequest(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.rollback(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.rollback(), と org.objectweb.cjdbc.controller.loadbalancer.raidb0.RAIDb0.rollback().

00198   {
00199     return success;
00200   }

int org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.getTotalNb  )  [inherited]
 

Returns the total number of threads.

戻り値:
an int value
参照:
setTotalNb

AbstractTask.java208 行で定義されています。

参照先 org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.totalNb.

00209   {
00210     return totalNb;
00211   }

boolean org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.hasTid  )  [inherited]
 

Returns true if this task has a tid attached to it.

Used internally by BackendWorkerThread.

戻り値:
Returns the hasTid.

AbstractTask.java231 行で定義されています。

00232   {
00233     return hasTid;
00234   }

synchronized boolean org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.notifyFailure BackendWorkerThread  backendThread,
long  timeout,
SQLException  e
throws SQLException [inherited]
 

Notifies that the specified backendThread failed to execute this task. If all nodes failed, this method return false meaning that the problem was due to the task and not to the thread. If the method returns true, it can mean that this thread failed and is no more coherent, therefore the backend associated to this thread should be disabled.

引数:
backendThread the backend thread that has failed
timeout time in milliseconds to wait for other threads to signal success or failure
e the exception causing the failure
戻り値:
true if at least one node succeeded to execute this task, false if all threads failed
例外:
SQLException if an error occured in the notification process

AbstractTask.java127 行で定義されています。

参照先 org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.exceptions, org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.failed, org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.success, と org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.totalNb.

参照元 org.objectweb.cjdbc.controller.loadbalancer.tasks.WriteStoredProcedureTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.WriteRequestWithKeysTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.WriteRequestTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.SelectRequestTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.RollbackTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.CommitTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.BeginTask.execute(), と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.kill().

00129   {
00130     failed++;
00131 
00132     // Log the exception
00133     if (exceptions == null)
00134       exceptions = new ArrayList();
00135     exceptions.add(new SQLException("BackendThread "
00136         + backendThread.getBackend().getName() + " failed (" + e + ")"));
00137 
00138     // Notify if needed
00139     if (success + failed == totalNb)
00140     {
00141       notifyAll(); // Notify all failed threads
00142     }
00143     else
00144     {
00145       try
00146       { // Wait to check if all other threads failed or not
00147         wait(timeout);
00148       }
00149       catch (InterruptedException ie)
00150       {
00151         throw new SQLException("Wait interrupted() in failed task of backend "
00152             + backendThread.getBackend().getName() + " (" + e + ")");
00153       }
00154     }
00155     return success > 0;
00156   }

synchronized void org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.notifySuccess  )  [inherited]
 

Notifies the successful completion of this task.

AbstractTask.java96 行で定義されています。

参照先 org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.failed, org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.nbToComplete, org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.success, と org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.totalNb.

参照元 org.objectweb.cjdbc.controller.loadbalancer.tasks.WriteStoredProcedureTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.WriteRequestWithKeysTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.WriteRequestTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.SelectRequestTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.RollbackTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.KillThreadTask.execute(), org.objectweb.cjdbc.controller.loadbalancer.tasks.CommitTask.execute(), と org.objectweb.cjdbc.controller.loadbalancer.tasks.BeginTask.execute().

00098   {
00099     success++;
00100 
00101     // Notify if needed
00102     if ((success == nbToComplete) || (success + failed == totalNb))
00103     {
00104       if (failed > 0)
00105         notifyAll(); // Notify all failed threads too
00106       else
00107         notify();
00108     }
00109   }

void org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.setHasTid boolean  hasTid  )  [inherited]
 

Sets the hasTid value.

Used internally by BackendWorkerThread.

引数:
hasTid The hasTid to set.

AbstractTask.java243 行で定義されています。

参照元 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addPriorityTask(), と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addTask().

00244   {
00245     this.hasTid = hasTid;
00246   }

void org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.setTotalNb int  totalNb  )  [inherited]
 

Sets the total number of threads.

引数:
totalNb the total number of threads to set
参照:
getTotalNb

AbstractTask.java219 行で定義されています。

参照元 org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.callStoredProcedure().

00220   {
00221     this.totalNb = totalNb;
00222   }

String org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTask.toString  ) 
 

参照:
java.lang.Object#toString()

ReadStoredProcedureTask.java290 行で定義されています。

参照先 org.objectweb.cjdbc.common.sql.AbstractRequest.getSQL(), と org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTask.proc.

00291   {
00292     return "ReadStoredProcedureTask (" + proc.getSQL() + ")";
00293   }


変数

StoredProcedure org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTask.proc [private]
 

ReadStoredProcedureTask.java46 行で定義されています。

参照元 org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTask.execute(), と org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTask.toString().

ResultSet org.objectweb.cjdbc.controller.loadbalancer.tasks.ReadStoredProcedureTask.result [private]
 

ReadStoredProcedureTask.java47 行で定義されています。


このクラスの説明は次のファイルから生成されました:
CJDBCversion1.0rc6に対してWed May 5 18:02:47 2004に生成されました。 doxygen 1.3.6