Jakarta ee 多线程java应用程序中的javascript评估

Jakarta ee 多线程java应用程序中的javascript评估,jakarta-ee,rhino,Jakarta Ee,Rhino,我们使用Rhino引擎来评估javaEE应用程序中的javascript(我们使用javascript作为参数化,在DTO-s之间传递数据和条件参数化等)。 我们做了一些性能测试,结果很奇怪 javascript引擎非常慢。持续时间呈指数增长。 我想把整个引擎换成纳什隆,但在此之前,我试图改善我们现在的状况 关于我们使用它的方式的一些代码片段(可能问题在这里(?) 每次尝试对表达式求值时,我都会通过以下方式创建JavaScriptEval对象: public void init() {

我们使用Rhino引擎来评估javaEE应用程序中的javascript(我们使用javascript作为参数化,在DTO-s之间传递数据和条件参数化等)。 我们做了一些性能测试,结果很奇怪

javascript引擎非常慢。持续时间呈指数增长。 我想把整个引擎换成纳什隆,但在此之前,我试图改善我们现在的状况

关于我们使用它的方式的一些代码片段(可能问题在这里(?) 每次尝试对表达式求值时,我都会通过以下方式创建JavaScriptEval对象:

public void init() {

    Context cc = Context.getCurrentContext();
    if ( cc == null) {
        cc = Context.enter();
    }
    this.ctx = cc;
    this.scope =this.ctx.initStandardObjects(null);
    this.wrapFactory = new WrapFactory();
}
之后,我们将对象(例如DTO-s)添加到范围中

private void putObject(String id, Object obj) {

    Context ctx = setupContext();
    if (obj != null) {
        Scriptable paramWrapper = this.wrapFactory.wrapAsJavaObject(/*this.ctx*/ ctx, this.scope, obj, obj.getClass());
        this.scope.put(id, this.scope, paramWrapper);
    } 
}
之后,我们用以下方法计算表达式:

public Object eval(Object scriptId, String source){
    Object ret;
    ret = ctx.evaluateString(this.scope,source, scriptId.toString(), 1, null);  
    return ret;
}
我试着使用某种缓存。我使用了compileString方法,然后将其放入缓存中。但是这样的内存使用率非常高

之后,我尝试限制放入缓存中的javascript源代码的长度。但问题是,随着并发使用率的增加,性能也变得不稳定

有什么想法吗?
欢迎所有建议

我认为没有好的答案:)

但我解决了这个问题: 我预编译了表达式,如果它是一个简单的init(类似于dto.setA(1))就用java代码执行它

另一种方法是对分离的进程使用分离的缓存,然后将其删除

这是解决这个问题的一种非常具体的方法,但我为自己工作:)