当前位置: 首页 > 面试题库 >

Java neo4j,REST和内存

葛骏
2023-03-14
问题内容

我已经在Jersey tomcat下使用Neo4j Java嵌入式版本针对REST
API部署了一个应用程序。通过使用jconsole测量内存使用情况,我注意到每个REST调用都会增加200Mb的内存(我认为这是因为整个图形都已加载到内存中)。因此,仅用5个调用,服务器便分配了1Gb的内存!要清理内存,我必须等待垃圾收集器(阈值设置为1Gb)。

这是因为我使用的是neo4j java嵌入式版本,还是正常的行为?当API调用结束时,我应该怎么做以释放内存?

下面是示例代码:

@GET
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public Response getApi( @QueryParam("q")    String query){
try{
// new neo instance here with EmbeddedGraphDatabase
... some code
// stop neo
}catch(Exception ex){
// stop neo
}
return response.ok("json data here").build();   
}

谢谢,丹妮尔

--------完整的分类代码----------

 import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.kernel.EmbeddedGraphDatabase;

@Path("/API")
public class API {

     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public Response apiCall(@QueryParam("q") String query){
        GraphDatabaseService graphDb; 
        try{
            // start neo
            graphDb = new EmbeddedGraphDatabase( "/var/neo4jdb/" );
            this.registerShutdownHook( graphDb );

            // API + NEO code here..

            // stop neo
            graphDb.shutdown();

        }catch(Exception ex){
            // stop neo
            graphDb.shutdown();
        }

        Response response = null;
        return response.ok("This is your query: "+query).build();

     }

    /**
     * Server shutdown
     */
    public void registerShutdownHook( final GraphDatabaseService graphDb ){
        // Registers a shutdown hook for the Neo4j instance so that it
        // shuts down nicely when the VM exits (even if you "Ctrl-C" the
        // running example before it's completed)
        Runtime.getRuntime()
                .addShutdownHook( new Thread()
                {
                    @Override
                    public void run()
                    {
                        graphDb.shutdown();
                    }
                } );
    }

}

然后我像这样通过浏览器调用REST服务 http://localhost:8080/API?q=test

用辛格尔顿更新

     import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.QueryParam;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.Response;

    import org.neo4j.graphdb.GraphDatabaseService;
    import org.neo4j.kernel.EmbeddedGraphDatabase;

    @Path("/API")
    public class API {

         @GET
         @Produces(MediaType.APPLICATION_JSON)
         public Response apiCall(@QueryParam("q") String query){
            GraphDatabaseService graphDb; 
            try{
                // start neo
                Neo4jSingleton neo4jInstance = new Neo4jSingleton();
                GraphDatabaseService graphDb = null;
                graphDb = neo4jInstance.getInstance(DB_PATH);
                this.registerShutdownHook( graphDb );

                // API + NEO code here..
                // cypher query
                        ExecutionEngine engine = new ExecutionEngine(graphDb); 
                        String queryString = "Cypher query code";
                        ExecutionResult result = engine.execute( queryString );
                        // fetch results here..

                // never stop neo now with singleton


            }catch(Exception ex){
                // stop neo
                graphDb.shutdown();
            }

            Response response = null;
            return response.ok("This is your query: "+query).build();

         }

        /**
         * Server shutdown
         */
        public void registerShutdownHook( final GraphDatabaseService graphDb ){
            // Registers a shutdown hook for the Neo4j instance so that it
            // shuts down nicely when the VM exits (even if you "Ctrl-C" the
            // running example before it's completed)
            Runtime.getRuntime()
                    .addShutdownHook( new Thread()
                    {
                        @Override
                        public void run()
                        {
                            graphDb.shutdown();
                        }
                    } );
        }

    }
public class Neo4jSingleton {

    private static GraphDatabaseService db;

    public Neo4jSingleton() {

    }

    /*
     * il metodo di restituire un'unica istanza
     * contenente il database neo4j
     */
    public static GraphDatabaseService getInstance(String DB_PATH)
      {

        //Boolean isDbChange=verifyDbChange();

        if (db == null /*|| isDbChange*/)
        {
          db = new EmbeddedGraphDatabase(DB_PATH);
        }

        return db;
      }
}

问题答案:

您不能为每个请求都创建Neo4j实例。请只创建一次,然后将其传递给您,要么在静态字段中变乱(因为您是为每个请求重新创建资源实例),要么在Neo4j服务器中注入了Provider
@Context

关于内存使用情况。Neo4j根据您的使用情况构建内部缓存,以在下一次更快地处理相同的查询。因此,这可能相当于一些已用的内存。

顺便说一句。您的图形有多大?您执行的典型操作是什么?



 类似资料:
  • 由于GIS功能非常丰富,为了便于用户快速获取所需内容,SuperMap iServer将GIS功能进行分类,并把每一类GIS功能封装为一套REST类型的GIS服务并开放完整的REST API。 REST服务 功能描述 地图REST服务 与地图相关的功能,例如地图浏览、缩放、查询、对图层的操作等 数据REST服务 与数据相关的功能,例如对数据集、数据源的操作,编辑GIS数据等 空间分析REST服务

  • 问题内容: 我正在开发一个带有Rest接口和一个飞镖的Spring Boot应用程序。 XMLHttpRequest确实执行一个OPTIONS请求,该请求的处理完全正确。此后,发出最终的GET(“ / products”)请求,但请求失败: 所请求的资源上不存在“ Access-Control-Allow-Origin”标头。因此,不允许访问源’ http:// localhost:63343 ‘

  • 问题内容: 给定具有JSONField的Django模型,使用对其进行序列化和反序列化的正确方法是什么? 我已经尝试过创建一个自定义和覆盖和: 但是,当我尝试使用来更新模型时,JSONField对象中的所有浮点数都变为字符串。 问题答案: 如果你使用的是Django Rest Framework> = 3.3,那么现在将包含 JSONField序列化程序。现在这是正确的方法。 如果你使用的是Dja

  • 我实现了一个模块来使用rest webservice(Json)并在oracle数据库中持久化。我只在Spring IOC上工作,但可以使用Spring BootRest模板和Spring数据JPA快速开发它。班级数量非常少。 对于json到java对象的转换,我使用http://www.jsonschema2pojo.org/并将所有生成的java对象复制到我的项目中。现在,我想包括logic/

  • 我正在开发一个带有Rest接口和前端dart的Spring Boot应用程序。 XMLHttpRequest确实执行了一个完全正确处理的选项请求。在此之后,发出最终的GET(“/products”)请求并失败: 所用版本:Spring Boot 1.3.0.m2 Spring 4.2.0.rc2 我错过了什么?

  • 问题内容: 我正在编写一些代码来与尚不存在的服务接口,因此我正在编写一个模拟器,以尝试降低当我有机会与实际系统集成时可能遇到的一些问题的风险。该接口基本上是一个REST风格的接口,该接口返回JSON格式的字符串。 接口规范说,将返回JSON格式的响应来代替标准HTTP正文。它还说来自服务器的响应将被zlib压缩,并在标头中设置“ Content- Encoding:gzip”。因此,我创建了一个W