neo4j查询后,Java进程不会停止

时间:2018-10-16 12:21:44

标签: java neo4j neo4j-ogm

我正在使用neo4j OGM的ConfigrationSourceSessionFactory连接到远程neo4j数据库,如下所示:

private final static ConfigurationSource props = new ClasspathConfigurationSource("neo4j-connection.properties");
    private final static Configuration configuration = new Configuration.Builder(props).build();
    private final static SessionFactory sessionFactory = new SessionFactory(configuration, "domain");

然后我运行一个密码查询并返回映射到带有OGM注释的neo4j节点的POJO的Iterable

private final LinkedBlockingQueue<Session> sessionPool = new LinkedBlockingQueue<>(8192);
@Override
    public Iterable<Location> findAll() {
        try {
            return session.loadAll(Location.class, 1);
        } finally {
            closeSession(session);
        }
    }
private void closeSession(Session session) {
        if (session != null) {
            try {
                sessionPool.offer(session, 100, TimeUnit.MILLISECONDS);
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }

一切正常,在我的主要方法中,我使用neo4j值创建了POJO对象

public static void main(String[] args) {
        LocationServiceImpl locationService = new LocationServiceImpl();
        Iterable<Location> locations = locationService.findAll();
        for(Location location : locations) {
            System.out.println(location.getSubType());//eg. prints Floor, Building etc
        }
        System.out.println("End");
    }

但是在main方法完成后,应用程序将不会停止。在“结束”字符串上方被打印。所以有些线程挂在某个地方,我不知道在哪里以及为什么。

我尝试关闭neo4j ogm会话,但是没有运气。

我的neo4j ogm pom依赖项

 <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-ogm-bolt-driver</artifactId>
            <version>3.1.2</version>
            <scope>runtime</scope>
        </dependency>
 <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-jdbc-driver</artifactId>
            <version>3.4.0</version>
        </dependency>
<dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-ogm-core</artifactId>
            <version>3.1.3</version>
        </dependency>

从可视vm打印屏幕 enter image description here

1 个答案:

答案 0 :(得分:1)

您还必须关闭SessionFactory

某些背景:我假设您正在使用Bolt协议进行连接。创建SessionFactory的实例还将创建一个具有所有连接池等的Java(螺栓)驱动程序实例。要进行干净的关闭调用sessionFactory.close(),这还将关闭/关闭驱动程序。