Author: ppoddar
Date: Fri Apr 16 18:29:33 2010
New Revision: 935033
URL: http://svn.apache.org/viewvc?rev=935033&view=rev
Log:
OPENJPA-703: Collect query statistics for a fixed number of queries, in a
thread-safe manner.
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryStatistics.java
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryStatistics.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryStatistics.java?rev=935033&r1=935032&r2=935033&view=diff
==============================================================================
---
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryStatistics.java
(original)
+++
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryStatistics.java
Fri Apr 16 18:29:33 2010
@@ -25,6 +25,8 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Set;
+import org.apache.openjpa.lib.util.concurrent.SizedConcurrentHashMap;
+
/**
* Records query execution statistics.
*
@@ -119,17 +121,23 @@ public interface QueryStatistics<T> exte
/**
* A default implementation.
+ *
+ * Maintains statistics for only a fixed number of queries.
*
*/
public static class Default<T> implements QueryStatistics<T> {
+ private static final int FIXED_SIZE = 1000;
+ private static final float LOAD_FACTOR = 0.75f;
+ private static final int CONCURRENCY = 16;
+
private static final int ARRAY_SIZE = 2;
private static final int READ = 0;
private static final int HIT = 1;
private long[] astat = new long[ARRAY_SIZE];
private long[] stat = new long[ARRAY_SIZE];
- private Map<T, long[]> stats = new HashMap<T, long[]>();
- private Map<T, long[]> astats = new HashMap<T, long[]>();
+ private Map<T, long[]> stats = new
SizedConcurrentHashMap(FIXED_SIZE, LOAD_FACTOR, CONCURRENCY);
+ private Map<T, long[]> astats = new
SizedConcurrentHashMap(FIXED_SIZE, LOAD_FACTOR, CONCURRENCY);
private Date start = new Date();
private Date since = start;
@@ -182,17 +190,17 @@ public interface QueryStatistics<T> exte
return start;
}
- public void reset() {
+ public synchronized void reset() {
stat = new long[ARRAY_SIZE];
stats.clear();
since = new Date();
}
- public void clear() {
+ public synchronized void clear() {
astat = new long[ARRAY_SIZE];
stat = new long[ARRAY_SIZE];
- stats = new HashMap<T, long[]>();
- astats = new HashMap<T, long[]>();
+ stats = new SizedConcurrentHashMap(FIXED_SIZE, LOAD_FACTOR,
CONCURRENCY);
+ astats = new SizedConcurrentHashMap(FIXED_SIZE, LOAD_FACTOR,
CONCURRENCY);
start = new Date();
since = start;
}
@@ -214,10 +222,10 @@ public interface QueryStatistics<T> exte
target.put(query, row);
}
- public void recordExecution(T query) {
+ public synchronized void recordExecution(T query) {
if (query == null)
return;
- boolean cached = (astats.containsKey(query));
+ boolean cached = astats.containsKey(query);
addSample(query, READ);
if (cached)
addSample(query, HIT);
@@ -244,8 +252,7 @@ public interface QueryStatistics<T> exte
out.println(i + ". \t" + toString(arow) + " \t" + key);
} else {
long[] row = stats.get(key);
- out.println(i + ". \t" + toString(arow) + " \t"
- + toString(row) + " \t\t" + key);
+ out.println(i + ". \t" + toString(arow) + " \t" +
toString(row) + " \t\t" + key);
}
}
}
@@ -257,8 +264,7 @@ public interface QueryStatistics<T> exte
}
String toString(long[] row) {
- return row[READ] + ":" + row[HIT] + "(" + pct(row[HIT], row[READ])
- + "%)";
+ return row[READ] + ":" + row[HIT] + "(" + pct(row[HIT], row[READ])
+ "%)";
}
}
}