src/org/objectweb/cjdbc/controller/loadbalancer/raidb1/RAIDb1_LPRF.java

説明を見る。
00001 00025 package org.objectweb.cjdbc.controller.loadbalancer.raidb1; 00026 00027 import java.sql.SQLException; 00028 import java.util.ArrayList; 00029 00030 import org.objectweb.cjdbc.common.exceptions.NoMoreBackendException; 00031 import org.objectweb.cjdbc.common.exceptions.UnreachableBackendException; 00032 import org.objectweb.cjdbc.common.i18n.Translate; 00033 import org.objectweb.cjdbc.common.sql.AbstractRequest; 00034 import org.objectweb.cjdbc.common.sql.SelectRequest; 00035 import org.objectweb.cjdbc.common.sql.StoredProcedure; 00036 import org.objectweb.cjdbc.common.xml.DatabasesXmlTags; 00037 import org.objectweb.cjdbc.controller.backend.DatabaseBackend; 00038 import org.objectweb.cjdbc.controller.cache.metadata.MetadataCache; 00039 import org.objectweb.cjdbc.controller.loadbalancer.policies.WaitForCompletionPolicy; 00040 import org.objectweb.cjdbc.controller.virtualdatabase.ControllerResultSet; 00041 import org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase; 00042 00054 public class RAIDb1_LPRF extends RAIDb1 00055 { 00056 // How the code is organized ? 00057 // 00058 // 1. Member variables 00059 // 2. Constructor(s) 00060 // 3. Request handling 00061 // 4. Debug/Monitoring 00062 00063 /* 00064 * Constructors 00065 */ 00066 00075 public RAIDb1_LPRF(VirtualDatabase vdb, 00076 WaitForCompletionPolicy waitForCompletionPolicy) throws SQLException 00077 { 00078 super(vdb, waitForCompletionPolicy); 00079 } 00080 00081 /* 00082 * Request Handling 00083 */ 00084 00093 public ControllerResultSet execReadRequest(SelectRequest request, 00094 MetadataCache metadataCache) throws SQLException 00095 { 00096 return executeLPRF(request, true, "Request ", metadataCache); 00097 } 00098 00107 public ControllerResultSet execReadOnlyReadStoredProcedure( 00108 StoredProcedure proc, MetadataCache metadataCache) throws SQLException 00109 { 00110 return executeLPRF(proc, false, "Stored procedure ", metadataCache); 00111 } 00112 00127 private ControllerResultSet executeLPRF(AbstractRequest request, 00128 boolean isSelect, String errorMsgPrefix, MetadataCache metadataCache) 00129 throws SQLException 00130 { 00131 // Choose a backend 00132 try 00133 { 00134 vdb.acquireReadLockBackendLists(); 00135 } 00136 catch (InterruptedException e) 00137 { 00138 String msg = Translate.get( 00139 "loadbalancer.backendlist.acquire.readlock.failed", e); 00140 logger.error(msg); 00141 throw new SQLException(msg); 00142 } 00143 00144 DatabaseBackend backend = null; // The backend that will execute the query 00145 00146 // Note that vdb lock is released in the finally clause of this try/catch 00147 // block 00148 try 00149 { 00150 ArrayList backends = vdb.getBackends(); 00151 int size = backends.size(); 00152 00153 if (size == 0) 00154 throw new SQLException(Translate.get( 00155 "loadbalancer.execute.no.backend.available", request.getId())); 00156 00157 // Choose the backend that has the least pending requests 00158 int leastRequests = 0; 00159 for (int i = 0; i < size; i++) 00160 { 00161 DatabaseBackend b = (DatabaseBackend) backends.get(i); 00162 if (b.isReadEnabled()) 00163 { 00164 int pending = b.getPendingRequests().size(); 00165 if ((backend == null) || (pending < leastRequests)) 00166 { 00167 backend = b; 00168 if (pending == 0) 00169 break; // Stop here we will never find a less loaded node 00170 else 00171 leastRequests = pending; 00172 } 00173 } 00174 } 00175 00176 if (backend == null) 00177 throw new NoMoreBackendException(Translate.get( 00178 "loadbalancer.execute.no.backend.enabled", request.getId())); 00179 } 00180 catch (RuntimeException e) 00181 { 00182 String msg = Translate.get("loadbalancer.execute.find.backend.failed", 00183 new String[]{request.getSQLShortForm(vdb.getSQLShortFormLength()), 00184 e.getMessage()}); 00185 logger.error(msg, e); 00186 throw new SQLException(msg); 00187 } 00188 finally 00189 { 00190 vdb.releaseReadLockBackendLists(); 00191 } 00192 00193 ControllerResultSet rs = null; 00194 // Execute the request on the chosen backend 00195 try 00196 { 00197 if (isSelect) 00198 rs = executeRequestOnBackend((SelectRequest) request, backend, 00199 metadataCache); 00200 else 00201 rs = executeStoredProcedureOnBackend((StoredProcedure) request, 00202 backend, metadataCache); 00203 } 00204 catch (UnreachableBackendException urbe) 00205 { 00206 // Try to execute query on different backend 00207 return executeLPRF(request, isSelect, errorMsgPrefix, metadataCache); 00208 } 00209 catch (SQLException se) 00210 { 00211 String msg = Translate.get("loadbalancer.something.failed", new String[]{ 00212 errorMsgPrefix, String.valueOf(request.getId()), se.getMessage()}); 00213 if (logger.isInfoEnabled()) 00214 logger.info(msg); 00215 throw new SQLException(msg); 00216 } 00217 catch (RuntimeException e) 00218 { 00219 String msg = Translate.get("loadbalancer.something.failed.on", 00220 new String[]{errorMsgPrefix, 00221 request.getSQLShortForm(vdb.getSQLShortFormLength()), 00222 backend.getName(), e.getMessage()}); 00223 logger.error(msg, e); 00224 throw new SQLException(msg); 00225 } 00226 00227 return rs; 00228 } 00229 00230 /* 00231 * Debug/Monitoring 00232 */ 00233 00239 public String getInformation() 00240 { 00241 // We don't lock since we don't need a top accurate value 00242 int size = vdb.getBackends().size(); 00243 00244 if (size == 0) 00245 return "RAIDb-1 Least Pending Request First load balancer: !!!Warning!!! No backend nodes found\n"; 00246 else 00247 return "RAIDb-1 Least Pending Request First load balancer (" + size 00248 + " backends)\n"; 00249 } 00250 00254 public String getRaidb1Xml() 00255 { 00256 return "<" + DatabasesXmlTags.ELT_RAIDb_1_LeastPendingRequestsFirst + "/>"; 00257 } 00258 00259 }

CJDBCversion1.0.4に対してTue Oct 12 15:16:02 2004に生成されました。 doxygen 1.3.8