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
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs