1 21 22 package org.continuent.sequoia.controller.virtualdatabase.protocol; 23 24 import java.io.Serializable ; 25 import java.sql.SQLException ; 26 import java.util.LinkedList ; 27 28 import org.continuent.sequoia.common.exceptions.NoMoreBackendException; 29 import org.continuent.sequoia.common.i18n.Translate; 30 import org.continuent.sequoia.controller.loadbalancer.AllBackendsFailedException; 31 import org.continuent.sequoia.controller.requestmanager.distributed.DistributedRequestManager; 32 import org.continuent.sequoia.controller.requests.StoredProcedure; 33 import org.continuent.sequoia.controller.requests.StoredProcedureCallResult; 34 35 42 public class DistributedCallableStatementExecute extends DistributedRequest 43 { 44 private static final long serialVersionUID = 8634424524848530342L; 45 46 52 public DistributedCallableStatementExecute(StoredProcedure proc) 53 { 54 super(proc); 55 } 56 57 60 public Object scheduleRequest(DistributedRequestManager drm) 61 throws SQLException 62 { 63 LinkedList totalOrderQueue = drm.getVirtualDatabase().getTotalOrderQueue(); 64 synchronized (totalOrderQueue) 65 { 66 totalOrderQueue.addLast(request); 67 } 68 return request; 69 } 70 71 74 public Serializable executeScheduledRequest(DistributedRequestManager drm) 75 throws SQLException 76 { 77 Serializable result = null; 78 StoredProcedure proc = (StoredProcedure) request; 79 boolean hasBeenScheduled = false; 80 try 81 { 82 drm.getLoadBalancer().waitForSuspendWritesToComplete(request); 83 84 drm.lazyTransactionStart(request); 86 drm.scheduleStoredProcedure(proc); 87 hasBeenScheduled = true; 88 89 if (drm.getLogger().isDebugEnabled()) 90 drm.getLogger().debug( 91 Translate.get("requestmanager.read.stored.procedure", new String []{ 92 String.valueOf(request.getId()), 93 request.getSqlShortForm(drm.getVirtualDatabase() 94 .getSqlShortFormLength())})); 95 96 if (proc.isReadOnly()) 97 { 98 drm.getLoadBalancer().removeObjectFromAndNotifyTotalOrderQueue(request); 102 } 103 104 result = new StoredProcedureCallResult(proc, drm 105 .loadBalanceCallableStatementExecute(proc)); 106 107 if (drm.storeRequestResult(request, result)) 108 result = DistributedRequestManager.SUCCESSFUL_COMPLETION; 109 110 drm.updateRecoveryLogFlushCacheAndRefreshSchema(proc); 111 112 drm.getScheduler().storedProcedureCompleted(proc); 114 115 return result; 116 } 117 catch (NoMoreBackendException e) 118 { 119 if (drm.getLogger().isDebugEnabled()) 120 drm.getLogger().debug( 121 Translate.get( 122 "virtualdatabase.distributed.read.procedure.logging.only", 123 request.getSqlShortForm(drm.getVirtualDatabase() 124 .getSqlShortFormLength()))); 125 126 if (proc.isReadOnly()) 127 { 128 drm.getLoadBalancer().removeObjectFromAndNotifyTotalOrderQueue(request); 132 } 133 134 drm.addFailedOnAllBackends(request, hasBeenScheduled); 137 return e; 138 } 139 catch (AllBackendsFailedException e) 140 { 141 drm.addFailedOnAllBackends(request, hasBeenScheduled); 144 if (drm.getLogger().isDebugEnabled()) 145 drm 146 .getLogger() 147 .debug( 148 Translate 149 .get( 150 "virtualdatabase.distributed.read.procedure.all.backends.locally.failed", 151 request.getSqlShortForm(drm.getVirtualDatabase() 152 .getSqlShortFormLength()))); 153 return e; 154 } 155 catch (SQLException e) 156 { 157 drm.addFailedOnAllBackends(request, hasBeenScheduled); 160 drm.getLogger().warn( 161 Translate.get( 162 "virtualdatabase.distributed.read.procedure.sqlexception", e 163 .getMessage()), e); 164 return e; 165 } 166 catch (RuntimeException re) 167 { 168 drm.addFailedOnAllBackends(request, hasBeenScheduled); 171 drm.getLogger().warn( 172 Translate.get("virtualdatabase.distributed.read.procedure.exception", 173 re.getMessage()), re); 174 return new SQLException (re.getMessage()); 175 } 176 } 177 178 181 public String toString() 182 { 183 return "E " + request.getId() + " " + request.getTransactionId() + " " 184 + request.getUniqueKey(); 185 } 186 187 } | Popular Tags |