diff --git hcatalog/core/src/main/java/org/apache/hive/hcatalog/data/HCatRecordObjectInspectorFactory.java hcatalog/core/src/main/java/org/apache/hive/hcatalog/data/HCatRecordObjectInspectorFactory.java index 18bf3a4058..c35168122c 100644 --- hcatalog/core/src/main/java/org/apache/hive/hcatalog/data/HCatRecordObjectInspectorFactory.java +++ hcatalog/core/src/main/java/org/apache/hive/hcatalog/data/HCatRecordObjectInspectorFactory.java @@ -19,9 +19,11 @@ package org.apache.hive.hcatalog.data; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; +import java.util.concurrent.TimeUnit; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import org.apache.hadoop.hive.serde2.SerDeException; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory; @@ -40,11 +42,20 @@ public class HCatRecordObjectInspectorFactory { private final static Logger LOG = LoggerFactory.getLogger(HCatRecordObjectInspectorFactory.class); + private static final int INITIAL_CACHE_CAPACITY = 1024; + private static final int MAX_CACHE_CAPACITY = 10 * INITIAL_CACHE_CAPACITY; - static HashMap cachedHCatRecordObjectInspectors = - new HashMap(); - static HashMap cachedObjectInspectors = - new HashMap(); + private static final CacheBuilder boundedCache = + CacheBuilder.newBuilder() + .initialCapacity(INITIAL_CACHE_CAPACITY) + .maximumSize(MAX_CACHE_CAPACITY) + .concurrencyLevel(Runtime.getRuntime().availableProcessors()) + .expireAfterAccess(5, TimeUnit.MINUTES); + + private static final Cache cachedHCatRecordObjectInspectors + = boundedCache.build(); + private static final Cache cachedObjectInspectors + = boundedCache.build(); /** * Returns HCatRecordObjectInspector given a StructTypeInfo type definition for the record to look into @@ -54,7 +65,7 @@ */ public static HCatRecordObjectInspector getHCatRecordObjectInspector( StructTypeInfo typeInfo) throws SerDeException { - HCatRecordObjectInspector oi = cachedHCatRecordObjectInspectors.get(typeInfo); + HCatRecordObjectInspector oi = cachedHCatRecordObjectInspectors.getIfPresent(typeInfo); if (oi == null) { LOG.debug("Got asked for OI for {} [{} ]", typeInfo.getCategory(), typeInfo.getTypeName()); @@ -86,7 +97,7 @@ public static HCatRecordObjectInspector getHCatRecordObjectInspector( public static ObjectInspector getStandardObjectInspectorFromTypeInfo(TypeInfo typeInfo) { - ObjectInspector oi = cachedObjectInspectors.get(typeInfo); + ObjectInspector oi = cachedObjectInspectors.getIfPresent(typeInfo); if (oi == null) { LOG.debug("Got asked for OI for {}, [{}]", typeInfo.getCategory(), typeInfo.getTypeName()); @@ -123,7 +134,7 @@ public static ObjectInspector getStandardObjectInspectorFromTypeInfo(TypeInfo ty default: oi = null; } - cachedObjectInspectors.put(typeInfo, oi); + cachedObjectInspectors.asMap().put(typeInfo, oi); } return oi; }