You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2008/08/09 00:39:40 UTC
svn commit: r684132 - in /openjpa/trunk:
openjpa-kernel/src/main/java/org/apache/openjpa/datacache/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/datacache/stats/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persist...
Author: ppoddar
Date: Fri Aug 8 15:39:39 2008
New Revision: 684132
URL: http://svn.apache.org/viewvc?rev=684132&view=rev
Log:
OPENJPA-687: Add read/write/hit statitics to DataCache/StoreCache
Added:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/CacheStatistics.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/datacache/stats/
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/datacache/stats/TestStatistics.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Customer.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Order.java
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractDataCache.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCache.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DelegatingDataCache.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoreCache.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoreCacheImpl.java
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractDataCache.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractDataCache.java?rev=684132&r1=684131&r2=684132&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractDataCache.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractDataCache.java Fri Aug 8 15:39:39 2008
@@ -46,11 +46,14 @@
public abstract class AbstractDataCache
extends AbstractConcurrentEventManager
implements DataCache, Configurable {
+
+ protected CacheStatistics.Default stats = new CacheStatistics.Default();
private static final BitSet EMPTY_BITSET = new BitSet(0);
private static final Localizer s_loc =
Localizer.forPackage(AbstractDataCache.class);
+
/**
* The configuration set by the system.
@@ -152,19 +155,30 @@
if (log.isTraceEnabled())
log.trace(s_loc.get("cache-timeout", key));
}
-
if (log.isTraceEnabled()) {
if (o == null)
log.trace(s_loc.get("cache-miss", key));
else
log.trace(s_loc.get("cache-hit", key));
}
-
+ stats.newGet((o == null) ? null : o.getType(), o != null);
return o;
}
+
+ /**
+ * Returns the objects for the given key List.
+ */
+ public Map getAll(List keys) {
+ Map resultMap = new HashMap(keys.size());
+ for(Object key : keys)
+ resultMap.put(key, get(key));
+ return resultMap;
+ }
+
public DataCachePCData put(DataCachePCData data) {
DataCachePCData o = putInternal(data.getId(), data);
+ stats.newPut((o == null) ? null : o.getType());
if (log.isTraceEnabled())
log.trace(s_loc.get("cache-put", data.getId()));
return (o == null || o.isTimedOut()) ? null : o;
@@ -352,15 +366,16 @@
* given oid.
*/
protected abstract DataCachePCData putInternal(Object oid,
- DataCachePCData pc);
-
+ DataCachePCData pc);
+
/**
- * All all of the given objects to the cache.
+ * Add all of the given objects to the cache.
*/
protected void putAllInternal(Collection pcs) {
DataCachePCData pc;
for (Iterator iter = pcs.iterator(); iter.hasNext();) {
pc = (DataCachePCData) iter.next();
+ stats.newPut(pc.getType());
putInternal(pc.getId(), pc);
}
}
@@ -414,6 +429,10 @@
* Unpin an object from the cache.
*/
protected abstract boolean unpinInternal(Object oid);
+
+ public CacheStatistics getStatistics() {
+ return stats;
+ }
// ---------- Configurable implementation ----------
@@ -442,14 +461,4 @@
log.warn(s_loc.get("exp-listener-ex"), e);
}
}
-
- /**
- * Returns the objects for the given key List.
- */
- public Map getAll(List keys) {
- Map resultMap = new HashMap(keys.size());
- for(int i=0; i<keys.size(); i++)
- resultMap.put(keys.get(i), get(keys.get(i)));
- return resultMap;
- }
}
Added: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/CacheStatistics.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/CacheStatistics.java?rev=684132&view=auto
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/CacheStatistics.java (added)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/CacheStatistics.java Fri Aug 8 15:39:39 2008
@@ -0,0 +1,233 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.datacache;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Counts number of read/write requests and hit ratio for a cache in total and
+ * per-class basis.
+ *
+ * All methods with Class as input argument treats null as
+ * <code>java.lang.Object</code>. All per-class statistics depends on
+ * determining the runtime type of the instance being cached. If it is not
+ * possible to determine the runtime type from the given context, the statistics
+ * is registered under generic <code>java.lang.Object</code>.
+ *
+ * @since 1.3.0
+ *
+ * @author Pinaki Poddar
+ *
+ */
+public interface CacheStatistics extends Serializable {
+ /**
+ * Gets number of total read requests since last reset.
+ */
+ public long getReadCount();
+
+ /**
+ * Gets number of total read requests that has been found in cache since
+ * last reset.
+ */
+ public long getHitCount();
+
+ /**
+ * Gets number of total write requests since last reset.
+ */
+ public long getWriteCount();
+
+ /**
+ * Gets number of total read requests since start.
+ */
+ public long getTotalReadCount();
+
+ /**
+ * Gets number of total read requests that has been found in cache since
+ * start.
+ */
+ public long getTotalHitCount();
+
+ /**
+ * Gets number of total write requests since start.
+ */
+ public long getTotalWriteCount();
+
+ /**
+ * Gets number of total read requests for the given class since last reset.
+ */
+ public long getReadCount(Class c);
+
+ /**
+ * Gets number of total read requests that has been found in cache for the
+ * given class since last reset.
+ */
+ public long getHitCount(Class c);
+
+ /**
+ * Gets number of total write requests for the given class since last reset.
+ */
+ public long getWriteCount(Class c);
+
+ /**
+ * Gets number of total read requests for the given class since start.
+ */
+ public long getTotalReadCount(Class c);
+
+ /**
+ * Gets number of total read requests that has been found in cache for the
+ * given class since start.
+ */
+ public long getTotalHitCount(Class c);
+
+ /**
+ * Gets number of total write requests for the given class since start.
+ */
+ public long getTotalWriteCount(Class c);
+
+ /**
+ * Gets the time of last reset.
+ */
+ public Date since();
+
+ /**
+ * Gets the time of start.
+ */
+ public Date start();
+
+ /**
+ * Clears all accumulated statistics.
+ */
+ public void reset();
+
+ /**
+ * A default implementation.
+ *
+ */
+ public static class Default implements CacheStatistics {
+ private long[] astat = new long[3];
+ private long[] stat = new long[3];
+ private Map<Class, long[]> stats = new HashMap<Class, long[]>();
+ private Map<Class, long[]> astats = new HashMap<Class, long[]>();
+ private Date start = new Date();
+ private Date since = new Date();
+
+ private static final int READ = 0;
+ private static final int HIT = 1;
+ private static final int WRITE = 2;
+
+ public long getReadCount() {
+ return stat[READ];
+ }
+
+ public long getHitCount() {
+ return stat[HIT];
+ }
+
+ public long getWriteCount() {
+ return stat[WRITE];
+ }
+
+ public long getTotalReadCount() {
+ return astat[READ];
+ }
+
+ public long getTotalHitCount() {
+ return astat[HIT];
+ }
+
+ public long getTotalWriteCount() {
+ return astat[WRITE];
+ }
+
+ public long getReadCount(Class c) {
+ return getCount(stats, c, READ);
+ }
+
+ public long getHitCount(Class c) {
+ return getCount(stats, c, HIT);
+ }
+
+ public long getWriteCount(Class c) {
+ return getCount(stats, c, WRITE);
+ }
+
+ public long getTotalReadCount(Class c) {
+ return getCount(astats, c, READ);
+ }
+
+ public long getTotalHitCount(Class c) {
+ return getCount(astats, c, HIT);
+ }
+
+ public long getTotalWriteCount(Class c) {
+ return getCount(astats, c, WRITE);
+ }
+
+ private long getCount(Map<Class, long[]> target, Class c, int index) {
+ long[] row = target.get(c);
+ return (row == null) ? 0 : row[WRITE];
+ }
+
+ public Date since() {
+ return since;
+ }
+
+ public Date start() {
+ return start;
+ }
+
+ public void reset() {
+ stat = new long[3];
+ stats.clear();
+ since = new Date();
+ }
+
+ void newGet(Class cls, boolean hit) {
+ cls = (cls == null) ? Object.class : cls;
+ addSample(cls, READ);
+ if (hit) {
+ addSample(cls, HIT);
+ }
+ }
+
+ void newPut(Class cls) {
+ cls = (cls == null) ? Object.class : cls;
+ addSample(cls, WRITE);
+ }
+
+ private void addSample(Class c, int index) {
+ stat[index]++;
+ astat[index]++;
+ addSample(stats, c, index);
+ addSample(astats, c, index);
+ }
+
+ private void addSample(Map<Class, long[]> target, Class c, int index) {
+ long[] row = target.get(c);
+ if (row == null) {
+ row = new long[3];
+ }
+ row[index]++;
+ target.put(c, row);
+ }
+ }
+}
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCache.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCache.java?rev=684132&r1=684131&r2=684132&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCache.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCache.java Fri Aug 8 15:39:39 2008
@@ -264,4 +264,9 @@
* returns objects from the caches for a given list of keys
*/
public Map getAll(List keys);
+
+ /**
+ * Returns number of read/write request and cache hit ratio data.
+ */
+ public CacheStatistics getStatistics();
}
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DelegatingDataCache.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DelegatingDataCache.java?rev=684132&r1=684131&r2=684132&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DelegatingDataCache.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DelegatingDataCache.java Fri Aug 8 15:39:39 2008
@@ -345,4 +345,8 @@
throw translate(re);
}
}
+
+ public CacheStatistics getStatistics() {
+ return (_cache == null) ? null : _cache.getStatistics();
+ }
}
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/datacache/stats/TestStatistics.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/datacache/stats/TestStatistics.java?rev=684132&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/datacache/stats/TestStatistics.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/datacache/stats/TestStatistics.java Fri Aug 8 15:39:39 2008
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.datacache.stats;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+import org.apache.openjpa.datacache.CacheStatistics;
+import org.apache.openjpa.datacache.DataCache;
+import org.apache.openjpa.meta.ClassMetaData;
+import org.apache.openjpa.persistence.EntityManagerImpl;
+import org.apache.openjpa.persistence.jdbc.query.domain.Customer;
+import org.apache.openjpa.persistence.jdbc.query.domain.Order;
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+public class TestStatistics extends SingleEMFTestCase {
+ private CacheStatistics stats;
+
+ public void setUp() {
+ super.setUp(CLEAR_TABLES, Customer.class, Order.class,
+ "openjpa.DataCache", "true", "openjpa.RemoteCommitProvider",
+ "sjvm", "openjpa.Log", "DefaultLevel=WARN");
+ startCaching(Customer.class);
+ startCaching(Order.class);
+ assertTrue(((EntityManagerImpl) emf.createEntityManager()).getBroker()
+ .getPopulateDataCache());
+ stats = emf.getStoreCache().getStatistics();
+ assertNotNull(stats);
+ }
+
+ void startCaching(Class cls) {
+ ClassMetaData meta = emf.getConfiguration()
+ .getMetaDataRepositoryInstance().getMetaData(cls, null, true);
+ meta.setDataCacheName(DataCache.NAME_DEFAULT);
+ }
+
+ /**
+ * Tests that statistics captures correct data under perfect caching
+ * condition.
+ */
+ public void testPerfectCache() {
+ print(stats);
+ // populate a bunch of customer and order
+ int nCustomer = 20;
+ int nOrder = 10;
+ EntityManager em = emf.createEntityManager();
+ em.getTransaction().begin();
+ for (int j = 0; j < nCustomer; j++) {
+ Customer customer = new Customer();
+ customer.setName("Customer-" + j);
+ for (int k = 0; k < nOrder; k++) {
+ Order order = new Order();
+ order.setAmount(100);
+ customer.addOrder(order);
+ em.persist(order);
+ }
+ em.persist(customer);
+ }
+ em.getTransaction().commit();
+ em.clear();
+
+// print(stats);
+
+ em.getTransaction().begin();
+ Query query = em.createQuery("select c from Customer c");
+ for (int i = 0; i < 10; i++) {
+ em.clear();
+ stats.reset();
+ List<Customer> result = query.getResultList();
+ for (Customer c : result) {
+ c.getOrders();
+ }
+// print(stats);
+ assertEquals(stats.getReadCount(), stats.getHitCount());
+ assertEquals(0, stats.getWriteCount());
+ }
+ }
+
+ void assertStatistics(CacheStatistics stats, long[] expected) {
+ assertEquals(expected[0], stats.getReadCount());
+ assertEquals(expected[1], stats.getHitCount());
+ assertEquals(expected[2], stats.getWriteCount());
+ }
+
+ void print(CacheStatistics stats) {
+ System.err
+ .print("r:" + stats.getTotalReadCount() + " w:"
+ + stats.getTotalWriteCount() + " h:"
+ + stats.getTotalHitCount());
+ System.err.println(" since last reset r:" + stats.getReadCount()
+ + " w:" + stats.getWriteCount() + " h:" + stats.getHitCount());
+ }
+
+}
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Customer.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Customer.java?rev=684132&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Customer.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Customer.java Fri Aug 8 15:39:39 2008
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.jdbc.query.domain;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+@Entity
+public class Customer {
+ @Id
+ @GeneratedValue
+ private long id;
+
+ private String name;
+
+ @OneToMany(mappedBy="customer")
+ private Collection<Order> orders;
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Collection<Order> getOrders() {
+ return orders;
+ }
+
+ public void addOrder(Order order) {
+ if (orders == null)
+ orders = new ArrayList<Order>();
+ this.orders.add(order);
+ order.setCustomer(this);
+ }
+}
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Order.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Order.java?rev=684132&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Order.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Order.java Fri Aug 8 15:39:39 2008
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.jdbc.query.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="ORDERS")
+public class Order {
+ @Id
+ @GeneratedValue
+ private long id;
+
+ private int amount;
+
+ @ManyToOne
+ private Customer customer;
+
+ public int getAmount() {
+ return amount;
+ }
+
+ public void setAmount(int amount) {
+ this.amount = amount;
+ }
+
+ public Customer getCustomer() {
+ return customer;
+ }
+
+ public void setCustomer(Customer customer) {
+ this.customer = customer;
+ }
+
+ public long getId() {
+ return id;
+ }
+}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoreCache.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoreCache.java?rev=684132&r1=684131&r2=684132&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoreCache.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoreCache.java Fri Aug 8 15:39:39 2008
@@ -20,6 +20,7 @@
import java.util.Collection;
+import org.apache.openjpa.datacache.CacheStatistics;
import org.apache.openjpa.datacache.DataCache;
/**
@@ -96,6 +97,14 @@
* Clear the cache.
*/
public void evictAll();
+
+ /**
+ * Gets the number of read/write/hit on this receiver in total and per
+ * class basis.
+ *
+ * @since 1.3.0
+ */
+ public CacheStatistics getStatistics();
/**
* @deprecated cast to {@link StoreCacheImpl} instead. This
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoreCacheImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoreCacheImpl.java?rev=684132&r1=684131&r2=684132&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoreCacheImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoreCacheImpl.java Fri Aug 8 15:39:39 2008
@@ -22,6 +22,7 @@
import java.util.BitSet;
import java.util.Collection;
+import org.apache.openjpa.datacache.CacheStatistics;
import org.apache.openjpa.datacache.DataCache;
import org.apache.openjpa.datacache.DelegatingDataCache;
import org.apache.openjpa.meta.ClassMetaData;
@@ -129,6 +130,10 @@
public void evictAll() {
_cache.clear();
}
+
+ public CacheStatistics getStatistics() {
+ return (_cache == null) ? null : _cache.getStatistics();
+ }
/**
* Return metadata for the given class, throwing the proper exception