From 147eebb01b010aa15bcb3efbe1fef6cbfd16b3eb Mon Sep 17 00:00:00 2001 From: hengsin Date: Fri, 7 Aug 2020 19:05:34 +0800 Subject: [PATCH] IDEMPIERE-4405 Add basic cache statistics (#210) add hit and miss count for cache --- .../src/org/compiere/util/CCache.java | 24 +++++++++++++++++-- .../src/org/compiere/util/CacheInfo.java | 20 ++++++++++++++++ .../org/compiere/web/AdempiereMonitor.java | 4 ++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/util/CCache.java b/org.adempiere.base/src/org/compiere/util/CCache.java index e808dfbd9d..f4bd8cfa2f 100644 --- a/org.adempiere.base/src/org/compiere/util/CCache.java +++ b/org.adempiere.base/src/org/compiere/util/CCache.java @@ -24,6 +24,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicLong; import org.adempiere.base.Service; import org.idempiere.distributed.ICacheService; @@ -136,6 +137,9 @@ public class CCache implements CacheInterface, Map, Serializable /** Vetoable Change Support Name */ private static String PROPERTYNAME = "cache"; + private final AtomicLong m_hit = new AtomicLong(); + private final AtomicLong m_miss = new AtomicLong(); + /** * Get (table) Name * @return name @@ -227,7 +231,10 @@ public class CCache implements CacheInterface, Map, Serializable { return "CCache[" + m_name + ",Exp=" + getExpireMinutes() - + ", #" + cache.size() + "]"; + + ", #" + cache.size() + + ", Hit=" + getHit() + + ", Miss=" + getMiss() + + "]"; } // toString /** @@ -294,7 +301,12 @@ public class CCache implements CacheInterface, Map, Serializable public V get(Object key) { expire(); - return cache.get(key); + V v = cache.get(key); + if (v == null) + m_miss.getAndAdd(1); + else + m_hit.getAndAdd(1); + return v; } // get /** @@ -431,4 +443,12 @@ public class CCache implements CacheInterface, Map, Serializable public boolean isDistributed() { return m_distributed; } + + public long getHit() { + return m_hit.get(); + } + + public long getMiss() { + return m_miss.get(); + } } // CCache diff --git a/org.adempiere.base/src/org/compiere/util/CacheInfo.java b/org.adempiere.base/src/org/compiere/util/CacheInfo.java index 65ee7a723b..4bbfde6a0c 100644 --- a/org.adempiere.base/src/org/compiere/util/CacheInfo.java +++ b/org.adempiere.base/src/org/compiere/util/CacheInfo.java @@ -61,6 +61,8 @@ public class CacheInfo implements Serializable { private boolean distributed; private InetAddress nodeAddress; private String nodeId; + private long hit; + private long miss; /** * @@ -72,6 +74,8 @@ public class CacheInfo implements Serializable { expireMinutes = cache.getExpireMinutes(); maxSize = cache.getMaxSize(); distributed = cache.isDistributed(); + hit = cache.getHit(); + miss = cache.getMiss(); } /** @@ -131,6 +135,22 @@ public class CacheInfo implements Serializable { return nodeId; } + /** + * + * @return hit count + */ + public long getHit() { + return hit; + } + + /** + * + * @return miss count + */ + public long getMiss() { + return miss; + } + /** * * @param sortByName diff --git a/org.adempiere.server/src/main/servlet/org/compiere/web/AdempiereMonitor.java b/org.adempiere.server/src/main/servlet/org/compiere/web/AdempiereMonitor.java index b40e570fa3..95b232bd0d 100644 --- a/org.adempiere.server/src/main/servlet/org/compiere/web/AdempiereMonitor.java +++ b/org.adempiere.server/src/main/servlet/org/compiere/web/AdempiereMonitor.java @@ -1435,6 +1435,8 @@ public class AdempiereMonitor extends HttpServlet line.addElement(new th().addElement("Size")); line.addElement(new th().addElement("Expire (Minutes)")); line.addElement(new th().addElement("Max Size")); + line.addElement(new th().addElement("Hit")); + line.addElement(new th().addElement("Miss")); line.addElement(new th().addElement("Distributed")); table.addElement(line); @@ -1453,6 +1455,8 @@ public class AdempiereMonitor extends HttpServlet line.addElement(new td().addElement(WebEnv.getCellContent(ccache.getSize()))); line.addElement(new td().addElement(WebEnv.getCellContent(ccache.getExpireMinutes()))); line.addElement(new td().addElement(WebEnv.getCellContent(ccache.getMaxSize()))); + line.addElement(new td().addElement(WebEnv.getCellContent(ccache.getHit()))); + line.addElement(new td().addElement(WebEnv.getCellContent(ccache.getMiss()))); line.addElement(new td().addElement(WebEnv.getCellContent(ccache.isDistributed()))); if (ccache.getNodeId() != null) {