这是我们的用例。我们正在从数据库加载freemarker语法并进行处理。我们正在处理近百万条记录。事情很好。但是当我对应用程序进行概要分析时,我发现我的freemarker处理方法是瓶颈,而且花费了大部分时间。阅读了freemarker文档后,我得到了一些关于我的问题的指示。每次我正在处理时,我正在创建新的freemarker.template.Template对象(创建它似乎很昂贵)。我无法找到这样做的正确/更有效的方式。
public FTLTemplateEngine() { cfg = new Configuration(); } public String process(String template, Map<String, Object> input) throws IOException, TemplateException { String rc = null; final Writer out = new StringWriter(); try { final Template temp =new Template("TemporaryTemplate", new StringReader(template), cfg); temp.process(input, out); } catch (InvalidReferenceException e) { log.error("Unable to process FTL - " + template); throw new InvalidReferenceException("FTL expression has evaluated to null or it refers to something that doesn't exist. - " + template, Environment.getCurrentEnvironment()); } catch (TemplateException e) { log.error("Unable to process FTL - " + template); throw new TemplateException("Unable to process FTL - " + template, e, Environment.getCurrentEnvironment()); } catch (IOException e) { log.error("Unable to process FTL - " + template); throw new IOException("Unable to process FTL - " + template); } rc = out.toString(); out.close(); return rc.trim(); }
看看每次需要解析Freemarker时调用的进程方法。在这个方法中,我们每次都在创建新的Template对象。有办法避免这种情况吗?
答案 0 :(得分:1)
AFAIR您通常不直接调用Template
构造函数,但使用Configuration
实例执行此操作(请参阅Get the template和Template loading)。 Configuration
对象也使用caching,这可能有所帮助。您可能需要编写自己的TemplateLoader
才能从数据库加载FreeMarker模板。