Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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 在neo4j中嵌入j2v8库并重用V8运行时_Java_Neo4j_Java Threads_J2v8_Neo4j Plugin - Fatal编程技术网

Java 在neo4j中嵌入j2v8库并重用V8运行时

Java 在neo4j中嵌入j2v8库并重用V8运行时,java,neo4j,java-threads,j2v8,neo4j-plugin,Java,Neo4j,Java Threads,J2v8,Neo4j Plugin,我需要嵌入(JavaScript引擎的绑定,V8)以用于(图形数据库管理系统)用户定义的函数 因此,我的简单插件的代码: package js; import org.neo4j.procedure.*; import com.eclipsesource.v8.*; public class J2V8 { public static V8 v8 = V8.createV8Runtime(); @UserFunction("js.eval") @Descriptio

我需要嵌入(JavaScript引擎的绑定,V8)以用于(图形数据库管理系统)用户定义的函数

因此,我的简单插件的代码:

package js;

import org.neo4j.procedure.*;
import com.eclipsesource.v8.*;

public class J2V8
{

    public static V8 v8 = V8.createV8Runtime();

    @UserFunction("js.eval")
    @Description("js.eval(code) - eval the given javascript code.")
    public String eval( @Name("code") String code) 
    {
        if (code == null) code = "";
        try {
            int result = v8.executeIntegerScript(code);
            return result + "";
        } catch (final Exception se) { return se.toString(); }
    }

}
插件已正确编译和安装。用户函数
js.eval
的第一次调用不会出错。但第二次调用(以及以下所有调用)会出现错误:

Failed to invoke function `js.eval`: Caused by: java.lang.Error:
Invalid V8 thread access
我已经读过了,对单个运行时的所有访问都必须来自同一个线程

这意味着每次调用用户函数时,都需要创建运行时(
V8.createV8Runtime
)。但这是一项代价高昂的行动


所以问题是:如何避免每次调用函数时都需要创建V8运行时,并重用创建的V8运行时?

您可以在完成执行后释放锁,在执行前再次获取锁

if(v8==null) createV8Runtime();
v8.getLocker().acquire();
// execute your js here
v8.getLocker().release();

您可以在完成执行后释放锁柜,并在执行前再次获取锁柜

if(v8==null) createV8Runtime();
v8.getLocker().acquire();
// execute your js here
v8.getLocker().release();

你试过使用同步单例吗?你试过使用同步单例吗?