【问题标题】:Using neo4j-jdbc open-connection is bottleneck使用 neo4j-jdbc 开放连接是瓶颈
【发布时间】:2016-02-17 09:54:26
【问题描述】:

我正在将 neo4-jdbc 与池库 BasicDataSource 一起使用。

我遇到了巨大的延迟问题,因此我们对应用进行了分析,我们发现打开连接是原因。我不明白为什么我们使用池的开放连接需要这么长时间。这是我们个人资料的截图:

这是 Neo4jDatasourceRemote 的样子:

package com.comp.wm.common.repo;

import com.comp.wm.common.utils.Constants;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;

import javax.annotation.PostConstruct;
import java.sql.Connection;
import java.sql.SQLException;




    private final Logger logger = Logger.getLogger(Neo4jDataSourceRemote.class);

    private BasicDataSource ds;

    @Value("${neo4j.host:localhost}")
    private String NEO4J_HOST;

    @Value("${neo4j.port:7474}")
    private String NEO4J_PORT;

    @Value("${neo4j.username:nouser}")
    private String NEO4J_USERNAME;

    @Value("${neo4j.password:nopass}")
    private String NEO4J_PASSWORD;

    @Value("${neo4j.pool.size:200}")
    private int NEO4J_POOL_SIZE;

    private String GetUrl() {
        return String.format(Constants.NEO4J_JDBC_CONNECTIVITY_STRING, NEO4J_HOST, NEO4J_PORT);
    }


    @PostConstruct
    public void init(){
        ds = new BasicDataSource();
        ds.setInitialSize(300);
        ds.setDriverClassName("org.neo4j.jdbc.Driver");
        ds.setUrl(GetUrl());
        ds.setUsername(NEO4J_USERNAME);
        ds.setPassword(NEO4J_PASSWORD);
    }


    @Override
    public Connection openConnection() throws SQLException {
        return this.ds.getConnection();
    }

    @Override
    public void closeConnection(Connection conn) {
        try {
            if (conn != null)
                conn.close();
        } catch (SQLException ex) {
            logger.info("error closing connection", ex);
        }
    }
}

这是我如何对图表执行查询的示例:

public List<NearbyItem> executeQuery(..) {
        conn = neo4jDataSource.openConnection();


        String getUsersStatement = "some query..";

        try (PreparedStatement ps = conn.prepareStatement(getUsersStatement)) {
           ..
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
               ...
            }
        } catch (Exception e) {
            throw new RuntimeException("Error returning userId=" + userIdInput, e);
        } finally {
            neo4jDataSource.closeConnection(conn);
        }
        return distItemDatas;
    }

有什么想法吗?

【问题讨论】:

  • 您正在运行多少个并发操作?默认情况下,Neo4j 在 http 级别上每个核心使用 10 个线程。如果您打开了更多活动连接,则需要等待新连接。
  • 我每秒运行 120 个并发请求,执行相同的操作
  • 我怎样才能增加 neo4j 每个核心默认 10 个线程?

标签: java jdbc neo4j connection-pooling spring-data-neo4j


【解决方案1】:

根据上面的cmets,我会添加这个作为回复。

默认情况下,Neo4j 在 http 接口中运行 10 个内核线程。您可以调整neo4j-server.properties中的线程总数

org.neo4j.server.webserver.maxthreads=200

但是,您拥有的线程越多,您就越容易遭受上下文切换和锁定争用的影响。如果您增加线程数,我不会期望吞吐量大幅增加,您只需转移必须等待的点。从初始化(openCONnection)到处理查询。

【讨论】:

  • 那么你有什么建议呢?对于每个请求,我都在等待更多。我应该如何增加吞吐量并减少延迟?
  • 调整密码查询、改进数据模型、添加核心、使用企业集群进行横向扩展......您可以做的事情多种多样。
  • 我正在使用 Grapehn DB 托管的 neo4j。如您所知,我们无法扩展 neo4j,但使用更多从站。我每秒仅使用 100 个请求进行简单查询,并且已经存在延迟问题.. 有点担心
猜你喜欢
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2012-09-12
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多