Update of /var/cvs/src/org/mmbase/storage/implementation/database In directory james.mmbase.org:/tmp/cvs-serv14130
Modified Files: DatabaseStorageManager.java DatabaseStorageManagerFactory.java Added Files: ResultSetReader.java Log Message: MMB-1779, MMB-1780 See also: http://cvs.mmbase.org/viewcvs/src/org/mmbase/storage/implementation/database See also: http://www.mmbase.org/jira/browse/MMB-1779 See also: http://www.mmbase.org/jira/browse/MMB-1780 ResultSetReader.java is new Index: DatabaseStorageManager.java =================================================================== RCS file: /var/cvs/src/org/mmbase/storage/implementation/database/DatabaseStorageManager.java,v retrieving revision 1.206 retrieving revision 1.207 diff -u -b -r1.206 -r1.207 --- DatabaseStorageManager.java 4 Jan 2009 18:46:14 -0000 1.206 +++ DatabaseStorageManager.java 30 Jan 2009 20:07:33 -0000 1.207 @@ -13,6 +13,8 @@ import java.sql.*; import java.util.*; +import org.mmbase.module.database.MultiConnection; + import org.mmbase.bridge.Field; import org.mmbase.bridge.NodeManager; import org.mmbase.datatypes.*; @@ -33,7 +35,7 @@ * * @author Pierre van Rooden * @since MMBase-1.7 - * @version $Id: DatabaseStorageManager.java,v 1.206 2009/01/04 18:46:14 nklasens Exp $ + * @version $Id: DatabaseStorageManager.java,v 1.207 2009/01/30 20:07:33 michiel Exp $ */ public class DatabaseStorageManager implements StorageManager { @@ -45,6 +47,7 @@ private static final Logger log = Logging.getLoggerInstance(DatabaseStorageManager.class); + private static final Blob BLOB_SHORTED = new InputStreamBlob(null, -1); private static final CharTransformer UNICODE_ESCAPER = new org.mmbase.util.transformers.UnicodeEscaper(); @@ -125,19 +128,22 @@ */ public DatabaseStorageManager() {} - protected long getLogStartTime() { + protected final long getLogStartTime() { return System.currentTimeMillis(); } - // for debug purposes + protected final void logQuery(String query, long startTime) { + long duration = System.currentTimeMillis() - startTime; + if (log.isDebugEnabled()) { - long now = System.currentTimeMillis(); - log.debug("Time:" + (now - startTime) + " Query :" + query); + // This can probably by dropped, we log much nicer on org.mmbase.QUERIES now. + log.debug("Time:" + duration + " Query :" + query); if (log.isTraceEnabled()) { log.trace(Logging.stackTrace()); } } + getFactory().logQuery(query, duration); } // javadoc is inherited @@ -169,6 +175,13 @@ } + /** + * @since MMBase-1.9.1 + */ + public DatabaseStorageManagerFactory getFactory() { + return factory; + } + /** * @since MMBase-1.8.7 @@ -3229,4 +3242,51 @@ return result.wasNull(); } + + /** + * @since MMBase-1.9.1 + */ + private void checkActiveConnection(Throwable e) { + try { + Connection con = getActiveConnection(); + + if (con instanceof MultiConnection) { + + log.debug("Calling check after exception"); + try { + ((MultiConnection) con).checkAfterException(); + } catch (SQLException sqe) { + log.debug(sqe); + } + } else { + log.debug("Not a multiconnection"); + } + } catch (SQLException sqe) { + log.warn(sqe); + } + } + + /** + * @since MMBase-1.9.1 + */ + public void executeQuery(String sql, ResultSetReader reader) throws SQLException { + long startTime = getLogStartTime(); + String message = null; + try { + Connection con = getActiveConnection(); + PreparedStatement stmt = con.prepareStatement(sql); + ResultSet rs = stmt.executeQuery(); + reader.read(rs); + + } catch (SQLException e) { + checkActiveConnection(e); + message = e.getClass().getName(); // The Message can be ridicously long and contains + // several stacktraces (at least for mysql). + throw e; + } finally { + releaseActiveConnection(); + logQuery(sql + (message == null ? "" : " (" + message + ")"), startTime); + } + } + } Index: DatabaseStorageManagerFactory.java =================================================================== RCS file: /var/cvs/src/org/mmbase/storage/implementation/database/DatabaseStorageManagerFactory.java,v retrieving revision 1.54 retrieving revision 1.55 diff -u -b -r1.54 -r1.55 --- DatabaseStorageManagerFactory.java 1 Aug 2008 22:15:08 -0000 1.54 +++ DatabaseStorageManagerFactory.java 30 Jan 2009 20:07:33 -0000 1.55 @@ -26,6 +26,7 @@ import org.mmbase.storage.util.StorageReader; import org.mmbase.util.logging.*; import org.mmbase.util.ResourceLoader; +import org.mmbase.util.xml.UtilReader; import org.xml.sax.InputSource; /** @@ -41,7 +42,7 @@ * * @author Pierre van Rooden * @since MMBase-1.7 - * @version $Id: DatabaseStorageManagerFactory.java,v 1.54 2008/08/01 22:15:08 michiel Exp $ + * @version $Id: DatabaseStorageManagerFactory.java,v 1.55 2009/01/30 20:07:33 michiel Exp $ */ public class DatabaseStorageManagerFactory extends StorageManagerFactory<DatabaseStorageManager> { @@ -101,6 +102,23 @@ */ private File basePath = BASE_PATH_UNSET; + + /** + * @since MMBase-1.9.1 + */ + private int debugDuration = 50; + private int serviceDuration = 100; + private int infoDuration = 500; + private int warnDuration = 2000; + private int errorDuration = 5000; + private int fatalDuration = 1000000; + + final UtilReader.PropertiesMap<String> utilProperties = new UtilReader("querylogging.xml", + new Runnable() {public void run() {readDurations(); }}).getProperties(); + private void readDurations() { + debugDuration = Integer.parseInt(utilProperties.getProperty("debug", "" + debugDuration)); + } + public double getVersion() { return 0.1; } @@ -173,6 +191,9 @@ } + + + /** * Opens and reads the storage configuration document. * Obtain a datasource to the storage, and load configuration attributes. @@ -190,6 +211,9 @@ dataSource = createDataSource(null); // temporary source only used once, for the meta data. + + + String sqlKeywords; // test the datasource and retrieves options, @@ -435,6 +459,62 @@ } + /** + * @since MMBase-1.9.1 + */ + private String getLogSqlMessage(String sql, long queries, long time) { + StringBuilder mes = new StringBuilder(); + mes.append('#'); + mes.append(queries); + mes.append(" "); + if (time < 10) mes.append(' '); + if (time < 100) mes.append(' '); + if (time < 1000) mes.append(' '); + mes.append(time); + mes.append(" ms: ").append(sql); + return mes.toString(); + } + + /** + * @since MMBase-1.9.1 + */ + private Logger getLogger(String sql) { + return Logging.getLoggerInstance("org.mmbase.QUERIES." + sql.split(" ", 2)[0].toUpperCase()); + } + + private long count = 0; + + /** + * @since MMBase-1.9.1 + */ + protected void logQuery(String query, long duration) { + count++; + Logger qlog = getLogger(query); + if (duration < debugDuration) { + if (qlog.isTraceEnabled()) { + qlog.trace(getLogSqlMessage(query, count, duration)); + } + } else if (duration < serviceDuration) { + if (qlog.isDebugEnabled()) { + qlog.debug(getLogSqlMessage(query, count, duration)); + } + } else if (duration < infoDuration) { + if (qlog.isServiceEnabled()) { + qlog.service(getLogSqlMessage(query, count, duration)); + } + } else if (duration < warnDuration) { + qlog.info(getLogSqlMessage(query, count, duration)); + } else if (duration < errorDuration) { + qlog.warn(getLogSqlMessage(query, count, duration)); + } else if (duration < fatalDuration) { + qlog.error(getLogSqlMessage(query, count, duration)); + } else { + qlog.fatal(getLogSqlMessage(query, count, duration)); + } + } + + + public static void main(String[] args) { String u = "jdbc:hsql:test;test=b"; if (args.length > 0) u = args[0]; _______________________________________________ Cvs mailing list Cvs@lists.mmbase.org http://lists.mmbase.org/mailman/listinfo/cvs