1 10 package org.mmbase.module.database; 11 12 import java.util.*; 13 import java.sql.*; 14 import java.sql.DriverManager ; 15 16 import org.mmbase.util.*; 17 import org.mmbase.module.*; 18 19 import org.mmbase.util.logging.*; 20 21 30 public class JDBC extends ProcessorModule implements JDBCInterface { 31 32 private static final Logger log = Logging.getLoggerInstance(JDBC.class); 33 34 private Class classdriver; 35 private Driver driver; 36 private String jdbcDriver; 37 private String jdbcURL; 38 private String jdbcHost; 39 private int jdbcPort = -1; 40 private int maxConnections; 41 private int maxQueries; 42 private String jdbcDatabase; 43 private String databaseSupportClass; 44 private DatabaseSupport databaseSupport; 45 private MultiPoolHandler poolHandler; 46 private JDBCProbe probe = null; 47 private String defaultName; 48 private String defaultPassword; 49 private long probeTime; 50 private long maxLifeTime = 120000; 51 52 { 53 addFunction(new GetNodeListFunction("POOLS", PARAMS_PAGEINFO)); 54 addFunction(new GetNodeListFunction("CONNECTIONS", PARAMS_PAGEINFO)); 55 } 56 57 public void onload() { 58 getProps(); 59 getDriver(); 60 loadSupport(); 61 poolHandler = new MultiPoolHandler(databaseSupport, maxConnections, maxQueries); 62 poolHandler.setMaxLifeTime(maxLifeTime); 63 } 64 65 68 public void init() { 69 probe = new JDBCProbe(this, probeTime); 72 log.info("Module JDBC started (" + this + ")"); 73 74 } 75 76 80 public void reload() { 81 getProps(); 82 83 90 loadSupport(); 91 getDriver(); 92 } 93 94 public void unload() { 95 } 96 protected void shutdown() { 97 poolHandler.shutdown(); 98 } 99 100 103 private void getDriver() { 104 105 driver = null; 106 try { 107 classdriver = Class.forName(jdbcDriver); 108 109 Class.forName(jdbcDriver).newInstance(); 113 114 log.service("Loaded JDBC driver: " + jdbcDriver); 115 116 } catch (Exception e) { 117 log.fatal("JDBC driver not found: " + jdbcDriver , e); 118 } 119 120 if (log.isDebugEnabled()) { 121 log.debug("makeUrl(): " + makeUrl()); 122 } 123 124 125 for (Enumeration e = DriverManager.getDrivers(); e.hasMoreElements();) { 126 Driver d = (Driver) e.nextElement(); 127 if (log.isDebugEnabled()) { 128 log.debug("Driver " + d); 129 } 130 if (classdriver == d.getClass()) { 131 driver = d; 132 break; 133 } 134 } 135 if (driver == null) { 136 log.warn("getDriver(): the jdbc driver specified in jdbc.xml does not match the actual loaded driver "); 137 } 138 } 139 140 143 private void loadSupport() { 144 try { 145 Class cl = Class.forName(databaseSupportClass); 146 databaseSupport = (DatabaseSupport)cl.newInstance(); 147 databaseSupport.init(); 148 log.debug("Loaded load class : " + databaseSupportClass); 149 } catch (Exception e) { 150 log.error("Can't load class : " + databaseSupportClass + " " + e.getMessage(), e); 151 } 152 } 153 154 157 private void getProps() { 158 159 jdbcDriver = getInitParameter("driver"); 160 jdbcURL = getInitParameter("url"); 161 jdbcHost = getInitParameter("host"); 162 defaultName = getInitParameter("user"); 163 defaultPassword = getInitParameter("password"); 164 databaseSupportClass = getInitParameter("supportclass"); 165 probeTime = 30000; 166 String tmp = getInitParameter("probetime"); 167 if (tmp != null) { 168 try { 169 probeTime = (long) (Float.parseFloat(tmp) * 1000f); 170 log.info("Set jdbc-probeTime to " + probeTime + " ms"); 171 } catch (NumberFormatException e) { 172 log.warn("Specified probetime is not a invalid float :" + e + "(using default " + (probeTime / 1000) + " s)"); 173 } 174 } 175 176 177 tmp = getInitParameter("maxlifetime"); 178 if (tmp != null) { 179 try { 180 maxLifeTime = (long) (Float.parseFloat(tmp) * 1000f); 181 log.service("Set jdbc max life time to " + maxLifeTime + " ms"); 182 } catch (NumberFormatException e) { 183 log.warn("Specified max life time is not a invalid float :" + e + "(using default " + (maxLifeTime / 1000) + " s)"); 184 } 185 } 186 187 195 196 if (defaultName == null) { 197 defaultName = "wwwtech"; 198 log.warn("name was not set, using default: '" + defaultName +"'"); 199 } 200 if (defaultPassword == null) { 201 defaultPassword="xxxxxx"; 202 log.warn("name was not set, using default: '" + defaultPassword +"'"); 203 } 204 tmp = getInitParameter("port"); 205 if (tmp != null) { 206 try { 207 jdbcPort=Integer.parseInt(getInitParameter("port")); 208 } catch (NumberFormatException e) { 209 jdbcPort = 0; 210 log.warn("portnumber was not set or a invalid integer :" + e + "(using default " + jdbcPort + ")"); 211 } 212 } 213 try { 214 maxConnections=Integer.parseInt(getInitParameter("connections")); 215 } catch (Exception e) { 216 maxConnections = 8; 217 log.warn("connections was not set or a invalid integer :" + e + "(using default " + maxConnections + ")"); 218 } 219 try { 220 maxQueries = Integer.parseInt(getInitParameter("queries")); 221 } catch (Exception f) { 222 try { 223 maxQueries = Integer.parseInt(getInitParameter("querys")); } catch (Exception e) { 225 maxQueries = 500; 226 log.warn("querys was not set or a invalid integer :" + e + "(using default " + maxQueries + ")"); 227 } 228 } 229 jdbcDatabase = getInitParameter("database"); 230 if (databaseSupportClass == null || databaseSupportClass.length() == 0) { 231 databaseSupportClass="org.mmbase.module.database.DatabaseSupportShim"; 232 log.warn("database supportclass was not known, using default: " + databaseSupportClass); 233 } 234 } 235 236 242 public String makeUrl() { 243 return makeUrl(jdbcHost, jdbcPort, jdbcDatabase); 244 } 245 246 252 public String makeUrl(String dbm) { 253 return makeUrl(jdbcHost, jdbcPort, dbm); 254 } 255 256 262 public String makeUrl(String host,String dbm) { 263 return makeUrl(host, jdbcPort, dbm); 264 } 265 266 272 public String makeUrl(String host, int port, String dbm) { 273 String url = jdbcURL; 274 276 url = url.replaceAll("\\$DBM", dbm); 277 url = url.replaceAll("\\$HOST", host); 278 url = url.replaceAll("\\$PORT", "" + port); 279 280 return url; 281 } 282 283 286 public MultiConnection getConnection(String url, String name, String password) throws SQLException { 287 return poolHandler.getConnection(url, name, password); 288 } 289 290 293 public MultiConnection getConnection(String url) throws SQLException { 294 return poolHandler.getConnection(url, defaultName, defaultPassword); 295 } 296 297 300 public Connection getDirectConnection(String url,String name,String password) throws SQLException { 301 return DriverManager.getConnection(url, name, password); 302 } 303 304 307 public Connection getDirectConnection(String url) throws SQLException { 308 return DriverManager.getConnection(url, defaultName, defaultPassword); 309 } 310 311 314 public synchronized void checkTime() { 315 try { 316 if (poolHandler != null) poolHandler.checkTime(); 317 } catch(Exception e) { 318 log.error("could not check the time: " + e, e); 319 } 320 } 321 322 326 public Vector getList(PageInfo sp, StringTagger tagger, String value) { 327 String line = Strip.DoubleQuote(value,Strip.BOTH); 328 StringTokenizer tok = new StringTokenizer(line,"-\n\r"); 329 if (tok.hasMoreTokens()) { 330 String cmd = tok.nextToken(); 331 if (cmd.equals("POOLS")) return listPools(tagger); 332 if (cmd.equals("CONNECTIONS")) return listConnections(tagger); 333 } 334 return null; 335 } 336 337 private String stripSensistive(String name) { 340 int i = name.indexOf('?'); 343 int j = name.indexOf(','); 344 if ((i > j) && (j != -1)) i = j; 345 if (i !=- 1) { 346 return name.substring(0,i); 347 } else { 348 return name; 349 } 350 } 351 352 355 public Vector listPools(StringTagger tagger) { 356 Vector results = new Vector(); 357 for (Iterator i = poolHandler.keySet().iterator(); i.hasNext();) { 358 String name = (String ) i.next(); 359 MultiPool pool = poolHandler.get(name); 360 results.addElement(stripSensistive(name)); 361 results.addElement("" + pool.getSize()); 362 results.addElement("" + pool.getTotalConnectionsCreated()); 363 } 364 tagger.setValue("ITEMS", "3"); 365 return results; 366 } 367 368 371 public Vector listConnections(StringTagger tagger) { 372 Vector results = new Vector(); 373 for (Iterator i = poolHandler.keySet().iterator(); i.hasNext();) { 374 String name= (String ) i.next(); 375 MultiPool pool = poolHandler.get(name); 376 for (Iterator f = pool.getBusyPool(); f.hasNext();) { 377 MultiConnection realcon=(MultiConnection)f.next(); 378 results.addElement(stripSensistive(name.substring(name.lastIndexOf('/')+1))); 379 results.addElement(realcon.getStateString()); 380 results.addElement("" + realcon.getLastSQL()); 381 results.addElement("" + realcon.getUsage()); 382 } 384 for (Iterator f=pool.getPool();f.hasNext();) { 385 MultiConnection realcon=(MultiConnection)f.next(); 386 results.addElement(stripSensistive(name.substring(name.lastIndexOf('/')+1))); 387 results.addElement(realcon.getStateString()); 388 results.addElement("" + realcon.getLastSQL()); 389 results.addElement("" + realcon.getUsage()); 390 } 392 } 393 tagger.setValue("ITEMS", "4"); 394 return results; 395 } 396 397 400 public String getUser() { 401 return defaultName; 402 } 403 404 407 public String getPassword() { 408 return defaultPassword; 409 } 410 411 414 public String getDatabaseName() { 415 return getInitParameter("database"); 416 } 417 418 422 public String toString() { 423 return "host: '" + jdbcHost + "' port: '" + jdbcPort + "' database: '" + jdbcDatabase + "' user: '" + defaultName + "'" + (driver != null ? " driver: " + driver.getClass().getName() + "'" : "") + " max life time: " + maxLifeTime + " ms probe time: " + probeTime + " ms"; 424 } 425 } 426 | Popular Tags |