1 24 25 package org.continuent.sequoia.controller.virtualdatabase.protocol; 26 27 import java.io.Serializable ; 28 import java.sql.SQLException ; 29 import java.util.LinkedList ; 30 31 import org.continuent.sequoia.common.exceptions.NoMoreBackendException; 32 import org.continuent.sequoia.common.i18n.Translate; 33 import org.continuent.sequoia.controller.loadbalancer.AllBackendsFailedException; 34 import org.continuent.sequoia.controller.requestmanager.distributed.DistributedRequestManager; 35 import org.continuent.sequoia.controller.requests.StoredProcedure; 36 import org.continuent.sequoia.controller.requests.StoredProcedureCallResult; 37 38 44 public class DistributedCallableStatementExecuteQuery 45 extends DistributedRequest 46 { 47 private static final long serialVersionUID = 8634424524848530342L; 48 49 55 public DistributedCallableStatementExecuteQuery(StoredProcedure proc) 56 { 57 super(proc); 58 } 59 60 63 public Object scheduleRequest(DistributedRequestManager drm) 64 throws SQLException 65 { 66 LinkedList totalOrderQueue = drm.getVirtualDatabase().getTotalOrderQueue(); 67 synchronized (totalOrderQueue) 68 { 69 totalOrderQueue.addLast(request); 70 } 71 return request; 72 } 73 74 77 public Serializable executeScheduledRequest(DistributedRequestManager drm) 78 throws SQLException 79 { 80 Serializable result = null; 81 StoredProcedure proc = (StoredProcedure) request; 82 boolean hasBeenScheduled = false; 83 try 84 { 85 drm.getLoadBalancer().waitForSuspendWritesToComplete(request); 86 87 drm.lazyTransactionStart(request); 89 drm.scheduleStoredProcedure((StoredProcedure) request); 90 hasBeenScheduled = true; 91 92 if (drm.getLogger().isDebugEnabled()) 93 drm.getLogger().debug( 94 Translate.get("requestmanager.read.stored.procedure", new String []{ 95 String.valueOf(request.getId()), 96 request.getSqlShortForm(drm.getVirtualDatabase() 97 .getSqlShortFormLength())})); 98 99 if (proc.isReadOnly()) 100 { 101 drm.getLoadBalancer().removeObjectFromAndNotifyTotalOrderQueue(request); 105 } 106 107 result = new StoredProcedureCallResult(proc, drm 108 .loadBalanceCallableStatementExecuteQuery(proc)); 109 110 if (drm.storeRequestResult(request, result)) 111 result = DistributedRequestManager.SUCCESSFUL_COMPLETION; 112 113 drm.updateRecoveryLogFlushCacheAndRefreshSchema(proc); 114 115 drm.getScheduler().storedProcedureCompleted(proc); 117 118 return result; 119 } 120 catch (NoMoreBackendException e) 121 { 122 if (drm.getLogger().isDebugEnabled()) 123 drm.getLogger().debug( 124 Translate.get( 125 "virtualdatabase.distributed.read.procedure.logging.only", 126 request.getSqlShortForm(drm.getVirtualDatabase() 127 .getSqlShortFormLength()))); 128 129 if (proc.isReadOnly()) 130 { 131 drm.getLoadBalancer().removeObjectFromAndNotifyTotalOrderQueue(request); 135 } 136 137 drm.addFailedOnAllBackends(request, hasBeenScheduled); 140 throw e; 141 } 142 catch (AllBackendsFailedException e) 143 { 144 drm.addFailedOnAllBackends(request, hasBeenScheduled); 147 if (drm.getLogger().isDebugEnabled()) 148 drm 149 .getLogger() 150 .debug( 151 Translate 152 .get( 153 "virtualdatabase.distributed.read.procedure.all.backends.locally.failed", 154 request.getSqlShortForm(drm.getVirtualDatabase() 155 .getSqlShortFormLength()))); 156 return e; 157 } 158 catch (SQLException e) 159 { 160 drm.addFailedOnAllBackends(request, hasBeenScheduled); 163 drm.getLogger().warn( 164 Translate.get( 165 "virtualdatabase.distributed.read.procedure.sqlexception", e 166 .getMessage()), e); 167 return e; 168 } 169 catch (RuntimeException re) 170 { 171 drm.addFailedOnAllBackends(request, hasBeenScheduled); 175 drm.getLogger().warn( 176 Translate.get("virtualdatabase.distributed.read.procedure.exception", 177 re.getMessage()), re); 178 return new SQLException (re.getMessage()); 179 } 180 } 181 182 185 public String toString() 186 { 187 return "S " + request.getId() + " " + request.getTransactionId() + " " 188 + request.getUniqueKey(); 189 } 190 191 } | Popular Tags |