Замедление при получении соединения с использованием драйвера neo4j java jdbc - PullRequest
0 голосов
/ 27 мая 2019

У меня развернуто Java-приложение на сервере приложений Websphere.Я успешно могу подключиться к neo4j из моего java-приложения, используя драйвер jdbc.Но есть некоторые проблемы с производительностью, которые я использовал.В настоящее время сервер neo4j работает на Xms - 8G и Xmx-16GB.У меня меньше данных, примерно 40 МБ с 3100 узлами.Когда мы тестируем производительность по протоколу http с помощью cypher, производительность остается выдающейся.Но в java-приложении мы используем драйвер jdbc для подключения к neo4j через болт.Каждое создание соединения занимает около 100 мс, что добавляет задержку.При таком подходе мы можем достичь только 160 ударов в секунду с 500 одновременными запросами.При 500 одновременных вызовах запросы выстраиваются в очередь, а время ответа составляет 3 секунды.Любые указатели улучшения будут полезны.(Приложение и neo4j находятся на разных физических серверах в одной и той же VLAN).

Код, используемый для создания соединения, указан ниже.

Class.forName ("org.neo4j.jdbc.Driver").newInstance ();Соединение conn = DriverManager.getConnection ("jdbc: neo4j: bolt: // localhost: port");

1 Ответ

0 голосов
/ 27 мая 2019

Если вы делаете DriverManager.getConnection(), вы обходите пул соединений WebSphere, так как здесь вы получаете соединения напрямую из драйвера JDBC.

Чтобы повысить производительность, я рекомендую настроить источник данных с помощью консоли администратора , а затем обновить приложение, чтобы получать соединения из источника данных, а не напрямую из драйвера.Таким образом, соединения будут объединяться в WebSphere, и вы, вероятно, получите гораздо лучшую производительность.

РЕДАКТИРОВАТЬ: Газ отметил в комментариях, что Neo4j не предоставляет реализацию DataSource.Чтобы обойти это, вы можете реализовать простой, например, такой:

public class Neo4jDataSource implements javax.sql.DataSource {

    private PrintWriter pw;

    @Override
    public Connection getConnection() throws SQLException {
        return DriverManager.getConnection("jdbc:neo4j:bolt://localhost:port");
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        // change URL here if you want to authenticate differently for different
        // user/pass combos
        return DriverManager.getConnection("jdbc:neo4j:bolt://localhost:port");
    }

    @Override
    public PrintWriter getLogWriter() throws SQLException {
        return pw;
    }

    @Override
    public void setLogWriter(PrintWriter out) throws SQLException {
        pw = out;
    }

    @Override
    public void setLoginTimeout(int seconds) throws SQLException {
    }

    @Override
    public int getLoginTimeout() throws SQLException {
        return 0;
    }

    @Override
    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
        throw new SQLFeatureNotSupportedException();
    }

    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        throw new SQLFeatureNotSupportedException();
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        return false;
    }
}

В качестве альтернативы, если вы переключитесь на WebSphere Liberty, тогда вы можете настроить DataSource без необходимости писать свой собственныйDataSource.

...