【问题标题】:neo4j cdi @inject proper startupneo4j cdi @inject 正确启动
【发布时间】:2014-02-02 18:40:27
【问题描述】:

我遇到了 Neo4J 无法根据注入 Neo4J 数据库的类的范围静默保存节点的问题,因此我尝试将 Neo4j 数据库包装在以下类中:

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Singleton;
import javax.inject.Named;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.graphdb.index.Index;
import org.neo4j.graphdb.index.IndexManager;

@Named
@Singleton
public class GraphDatabaseMngr
{
    private static final String FILESYSTEM_DB = "target/dmsdb";
    private org.neo4j.graphdb.GraphDatabaseService graphDb;
    /* below is for node indexing */
    private IndexManager indexManager;
    private Index<Node> index;

    public GraphDatabaseMngr()
    {

    }

    @PostConstruct
    void postConstruct()
    {
        setUp();
    }

    @PreDestroy
    void preDestroy()
    {
        getGraphDb().shutdown();
    }

    public void setUp()
    {
        if (getGraphDb() == null)
        {
            setGraphDb(new GraphDatabaseFactory().newEmbeddedDatabase(FILESYSTEM_DB));
            setIndexManager(getGraphDb().index());
            setIndex(getIndexManager().forNodes("indexNodes"));
        }
    }
}

我想知道是否可以,将其注入@SessionScoped 类中是否可以。

到目前为止,该类似乎已正确注入,但在 neo4j 存储中获取和添加节点并不能按预期工作,节点未出现存储但未返回错误。

【问题讨论】:

    标签: jakarta-ee neo4j osgi


    【解决方案1】:

    代码对我来说看起来不错,但我更喜欢在 @PostConstruct 方法中初始化所有内容。

    @Named
    @Singleton
    public class GraphDatabaseMngr
    {
        private static final String FILESYSTEM_DB = "target/dmsdb";
        private org.neo4j.graphdb.GraphDatabaseService graphDb;
        /* below is for node indexing */
        private IndexManager indexManager;
        private Index<Node> index;
    
    
        @PostConstruct
        void postConstruct()
        {
            graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(FILESYSTEM_DB);
            indexManager = getGraphDb().index();
            index = indexManager.forNodes("indexNodes")
        }
    
        @PreDestroy
        void preDestroy()
        {
            graphDb.shutdown();
        }
    
       // your getters
    }
    

    将此 bean 注入应用程序的其他 bean(请求、会话或任何范围)应该没有问题。 诊断节点未存储的问题:向@PostConstruct/@PreDestroy 方法添加一些日志记录,以查看该bean 的生命周期是否正常(我很确定它是)。似乎我更多的是丢失交易的问题(但这应该由 Neo4j 报告) - 你能验证一下吗?

    【讨论】:

    • 我可以向您保证,Neo4j 没有报告任何错误,并且事务在调试时正确执行,只需将父 bean 的范围从会话更改为应用程序就可以神奇地工作。没有错误或警告没有回馈。我最终放弃了 Neo4J,因为我的设置太不稳定了,也没有人给我任何支持,所以猜测 Neo4J 在 Web 应用程序中的使用并不多。
    猜你喜欢
    • 2017-11-08
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2014-12-20
    相关资源
    最近更新 更多