Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,处理无字符串标记语法最有效的方法是什么_Java_Freemarker - Fatal编程技术网

在Java中,处理无字符串标记语法最有效的方法是什么

在Java中,处理无字符串标记语法最有效的方法是什么,java,freemarker,Java,Freemarker,这是我们的用例。我们正在从数据库中加载freemarker语法并对其进行处理。我们正在处理近百万条记录。事情进展顺利。但是,当我分析应用程序时,我发现我的freemarker处理方法是瓶颈,它占用了大部分时间。阅读了freemarker文档后,我得到了一些关于我的问题的建议。每次处理时,我都在创建新的freemarker.template.template对象(创建这个对象似乎很昂贵)。我找不到做这件事的正确/更有效的方法 public FTLTemplateEngine() {

这是我们的用例。我们正在从数据库中加载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();
    }   

公共FTLTemplateEngine(){
cfg=新配置();
}    
公共字符串进程(字符串模板、映射输入)抛出IOException、TemplateException{
字符串rc=null;
最终编写器输出=新StringWriter();
试试{
最终模板温度=新模板(“临时模板”,新StringReader(模板),cfg);
温度过程(输入、输出);
}
捕获(InvalidReferenceException e){
日志错误(“无法处理FTL-”+模板);
抛出新的InvalidReferenceException(“FTL表达式的计算结果为null,或者它引用了不存在的内容。-”+模板,环境。getCurrentEnvironment());
}
捕获(模板异常e){
日志错误(“无法处理FTL-”+模板);
抛出新的TemplateException(“无法处理FTL-”+模板,e,Environment.getCurrentEnvironment());
}
捕获(IOE异常){
日志错误(“无法处理FTL-”+模板);
抛出新IOException(“无法处理FTL-”+模板);
}
rc=out.toString();
out.close();
返回rc.trim();
}   


查看每次需要解析Freemarker时调用的process方法。在这个方法中,我们每次都创建新的模板对象。有没有办法避免这种情况

AFAIR您通常不直接调用
模板
构造函数,而是使用
配置
实例来实现(请参阅和)。
Configuration
对象也使用了,这可能会有所帮助。要从数据库加载FreeMarker模板,您可能需要编写自己的模板。

模板。流程执行模板,新模板执行解析。或者你的意思是你的过程方法需要时间,而这两者都需要时间?无论如何,您应该做一些更详细的分析来说明这一点。@ddekany,new Template(“TemporaryTemplate”,new StringReader(Template),cfg)占用了大部分时间。处理速度非常快。因此,您似乎必须缓存生成的
模板
-s。如果你的应用程序确实太慢,那就是@Anil我也面临同样的问题,
newtemplate()
需要时间。您是否找到了解决方法?当然,缓存也可以在没有配置的情况下完成,通过缓存新创建的
模板
-s。是的,缓存可以在没有配置的情况下完成,您是对的。