diff --git a/cayenne-server/src/main/java/org/apache/cayenne/velocity/VelocitySQLTemplateProcessor.java b/cayenne-server/src/main/java/org/apache/cayenne/velocity/VelocitySQLTemplateProcessor.java index 49fac9d85f..855bff547d 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/velocity/VelocitySQLTemplateProcessor.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/velocity/VelocitySQLTemplateProcessor.java @@ -41,6 +41,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; /** * Processor for SQL velocity templates. @@ -190,12 +192,16 @@ String buildStatement(VelocityContext context, String template, SimpleNode parse } } + private static final ConcurrentMap templateCache = new ConcurrentHashMap<>(); + private SimpleNode parse(String template) { - SimpleNode nodeTree = null; + SimpleNode nodeTree = templateCache.get(template); + if(nodeTree != null) return nodeTree; try { nodeTree = velocityRuntime.parse(new StringReader(template), template); + templateCache.putIfAbsent(template, nodeTree); } catch (ParseException pex) { throw new CayenneRuntimeException("Error parsing template '" + template + "' : " + pex.getMessage()); }