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

Reply via email to