src/org/objectweb/cjdbc/controller/recoverylog/JDBCLoggerThread.java

説明を見る。
00001 00025 package org.objectweb.cjdbc.controller.recoverylog; 00026 00027 import java.sql.PreparedStatement; 00028 import java.sql.SQLException; 00029 import java.util.ArrayList; 00030 00031 import org.objectweb.cjdbc.common.i18n.Translate; 00032 import org.objectweb.cjdbc.common.log.Trace; 00033 00040 public class JDBCLoggerThread extends Thread 00041 { 00042 private boolean killed = false; // Control thread death 00043 private ArrayList logQueue; 00044 private PreparedStatement pstmt; 00045 private Trace logger; 00046 00047 private class LogObject 00048 { 00049 private long tid; 00050 private String query; 00051 private String login; 00052 private long id; 00053 private boolean escapeProcessing; 00054 00064 public LogObject(long id, String login, String query, long tid, 00065 boolean escapeProcessing) 00066 { 00067 this.id = id; 00068 this.login = login; 00069 this.query = query; 00070 this.tid = tid; 00071 this.escapeProcessing = escapeProcessing; 00072 } 00073 00077 public long getId() 00078 { 00079 return id; 00080 } 00081 00085 public String getLogin() 00086 { 00087 return login; 00088 } 00089 00093 public String getQuery() 00094 { 00095 return query; 00096 } 00097 00101 public long getTid() 00102 { 00103 return tid; 00104 } 00105 00109 public boolean getEscapeProcessing() 00110 { 00111 return escapeProcessing; 00112 } 00113 } 00114 00121 public JDBCLoggerThread(PreparedStatement pstmt, Trace logger) 00122 { 00123 super("JDBCLoggerThread"); 00124 this.pstmt = pstmt; 00125 this.logger = logger; 00126 logQueue = new ArrayList(); 00127 } 00128 00138 public synchronized void log(long id, String login, String query, long tid, 00139 boolean escapeProcessing) 00140 { 00141 logQueue.add(new LogObject(id, login, query, tid, escapeProcessing)); 00142 notify(); 00143 } 00144 00148 public synchronized void rollbackTransactions() 00149 { 00150 if (logQueue.isEmpty()) 00151 { 00152 logger.debug(Translate 00153 .get("recovery.jdbc.loggerthread.rollback.no.transaction")); 00154 return; 00155 } 00156 // Find all begun transactions 00157 LogObject log; 00158 for (int i = 0; i < logQueue.size(); i++) 00159 { 00160 log = (LogObject) logQueue.get(i); 00161 if (log.getQuery().equalsIgnoreCase("begin")) 00162 { 00163 // Found beginning of transaction, let's roll it back 00164 rollbackTransaction(log.getTid()); 00165 } 00166 } 00167 } 00168 00175 public synchronized void rollbackTransaction(long tid) 00176 { 00177 logger.debug(Translate.get("recovery.jdbc.loggerthread.rollback", tid)); 00178 LogObject logEntry; 00179 for (int i = 0; i < logQueue.size(); i++) 00180 { 00181 logEntry = (LogObject) logQueue.get(i); 00182 if (logEntry.getTid() == tid) 00183 logQueue.remove(i); 00184 } 00185 } 00186 00192 public synchronized boolean getLogQueueIsEmpty() 00193 { 00194 if (logQueue.isEmpty()) 00195 { 00196 // Notifies the Recovery log that the queue is empty. 00197 notify(); 00198 return true; 00199 } 00200 else 00201 { 00202 return false; 00203 } 00204 } 00205 00210 public void run() 00211 { 00212 LogObject params; 00213 00214 while (!killed) 00215 { 00216 synchronized (this) 00217 { 00218 while (getLogQueueIsEmpty()) 00219 { 00220 try 00221 { 00222 wait(); 00223 } 00224 catch (InterruptedException e) 00225 { 00226 logger.warn(Translate.get("recovery.jdbc.loggerthread.awaken"), e); 00227 } 00228 } 00229 params = (LogObject) logQueue.remove(0); 00230 try 00231 { 00232 pstmt.setLong(1, params.getId()); 00233 pstmt.setString(2, params.getLogin()); 00234 pstmt.setString(3, params.getQuery()); 00235 pstmt.setLong(4, params.getTid()); 00236 try 00237 { 00238 pstmt.setEscapeProcessing(params.getEscapeProcessing()); 00239 } 00240 catch (Exception ignore) 00241 { 00242 } 00243 pstmt.executeUpdate(); 00244 if (logger.isDebugEnabled()) 00245 logger.debug(Translate.get("recovery.jdbc.loggerthread.log.debug", 00246 new String[]{String.valueOf(params.getId()), params.getLogin(), 00247 params.getQuery(), String.valueOf(params.getTid()), 00248 String.valueOf(params.getEscapeProcessing())})); 00249 else if (logger.isInfoEnabled()) 00250 logger.info(Translate.get("recovery.jdbc.loggerthread.log.info", 00251 params.getId())); 00252 } 00253 catch (SQLException e) 00254 { 00255 logger.error( 00256 Translate.get("recovery.jdbc.loggerthread.log.failed", 00257 new String[]{params.getQuery(), 00258 String.valueOf(params.getTid())}), e); 00259 } 00260 } 00261 } 00262 } 00263 00264 }

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