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 DistributedCallableStatementExecuteUpdate 45 extends DistributedRequest 46 { 47 private static final long serialVersionUID = 3550127604843949629L; 48 49 54 public DistributedCallableStatementExecuteUpdate(StoredProcedure proc) 55 { 56 super(proc); 57 } 58 59 62 public Object scheduleRequest(DistributedRequestManager drm) 63 throws SQLException 64 { 65 LinkedList totalOrderQueue = drm.getVirtualDatabase().getTotalOrderQueue(); 66 synchronized (totalOrderQueue) 67 { 68 totalOrderQueue.addLast(request); 69 } 70 return request; 71 } 72 73 76 public Serializable executeScheduledRequest(DistributedRequestManager drm) 77 throws SQLException 78 { 79 Serializable execWriteStoredProcedure = null; 80 StoredProcedure proc = (StoredProcedure) request; 81 boolean hasBeenScheduled = false; 82 try 83 { 84 drm.getLoadBalancer().waitForSuspendWritesToComplete(request); 85 86 drm.lazyTransactionStart(request); 88 drm.scheduleStoredProcedure((StoredProcedure) request); 89 hasBeenScheduled = true; 90 91 if (drm.getLogger().isDebugEnabled()) 92 drm.getLogger().debug( 93 Translate.get("requestmanager.write.stored.procedure", 94 new String []{ 95 String.valueOf(request.getId()), 96 request.getSqlShortForm(drm.getVirtualDatabase() 97 .getSqlShortFormLength())})); 98 99 execWriteStoredProcedure = new StoredProcedureCallResult(proc, drm 100 .loadBalanceCallableStatementExecuteUpdate(proc)); 101 102 if (drm.storeRequestResult(request, execWriteStoredProcedure)) 103 execWriteStoredProcedure = DistributedRequestManager.SUCCESSFUL_COMPLETION; 104 105 drm.updateRecoveryLogFlushCacheAndRefreshSchema(proc); 106 107 drm.getScheduler().storedProcedureCompleted(proc); 109 110 return execWriteStoredProcedure; 111 } 112 catch (NoMoreBackendException e) 113 { 114 if (drm.getLogger().isDebugEnabled()) 115 drm.getLogger().debug( 116 Translate.get( 117 "virtualdatabase.distributed.write.procedure.logging.only", 118 request.getSqlShortForm(drm.getVirtualDatabase() 119 .getSqlShortFormLength()))); 120 121 drm.addFailedOnAllBackends(request, hasBeenScheduled); 124 return e; 125 } 126 catch (AllBackendsFailedException e) 127 { 128 drm.addFailedOnAllBackends(request, hasBeenScheduled); 131 if (drm.getLogger().isDebugEnabled()) 132 drm 133 .getLogger() 134 .debug( 135 Translate 136 .get( 137 "virtualdatabase.distributed.write.procedure.all.backends.locally.failed", 138 request.getSqlShortForm(drm.getVirtualDatabase() 139 .getSqlShortFormLength()))); 140 return e; 141 } 142 catch (SQLException e) 143 { 144 drm.addFailedOnAllBackends(request, hasBeenScheduled); 147 drm.getLogger().warn( 148 Translate.get( 149 "virtualdatabase.distributed.write.procedure.sqlexception", e 150 .getMessage()), e); 151 return e; 152 } 153 catch (RuntimeException re) 154 { 155 drm.addFailedOnAllBackends(request, hasBeenScheduled); 158 drm.getLogger().warn( 159 Translate.get( 160 "virtualdatabase.distributed.write.procedure.exception", re 161 .getMessage()), re); 162 return new SQLException (re.getMessage()); 163 } 164 } 165 166 169 public String toString() 170 { 171 return "W " + request.getId() + " " + request.getTransactionId() + " " 172 + request.getUniqueKey(); 173 } 174 175 } | Popular Tags |