gpt4 book ai didi

neo4j - 在嵌入式 Neo4j 中处理事务的最佳方式?

转载 作者:行者123 更新时间:2023-12-02 13:36:49 25 4
gpt4 key购买 nike

我刚刚开始使用图形数据库,认为最好学习的是 neo4j。我有一个 Neo4j 的嵌入式实例在应用程序中运行(基于 JSF)。该应用程序的用例主要是让我学习使用图形数据库的概念和陷阱,并帮助确定最佳方法(即嵌入式或独立)。但我的测试应用程序是一个非常基本的联系人应用程序,能够定义关系(即 KNOWS、WORKS_WITH、WORKS_FOR 等),并最终能够根据这些关系提出建议(即“你可能也知道”)。

到目前为止,我已经完成了基本的 c.r.u.d 操作,并且可以添加/删除关系。我的下一步将是实际开始遍历图表(我认为)。但我当前遇到的问题是,一旦我与服务器的 session 过期,我就无法重新建立新 session ,除非收到 IllegalStateException 错误,提示商店当前正在使用中。我认为这是因为我从未在 neo4j 实例上调用 shutdown 。因此,这让我认为我处理交易的方式是错误的,所以我希望有人能够纠正我对我应该如何处理这个问题的理解(或误解,视情况而定)。

以下是我的帮助程序类中的一些方法,用于处理 Web 客户端和 Neo4j 之间的操作:

public class NeoNodeUtils {
private GraphDatabaseService graphDb;

public NeoNodeUtils() {
setup();
}

public void setup() {
GraphDatabaseFactory neoFactory = new GraphDatabaseFactory();
setGraphDb(neoFactory.newEmbeddedDatabase("Morpheus"));
registerShutdownHook();
}

public GraphDatabaseService getGraphDb() {
return graphDb;
}

public void setGraphDb(GraphDatabaseService graphDb) {
this.graphDb = graphDb;
}

public Node getNode(Long id) {
Transaction tx = getGraphDb().beginTx();
Node node = null;
try {
node = getGraphDb().getNodeById(id);
tx.success();
} catch (Exception e) {
tx.failure();
e.printStackTrace();
} finally {
tx.finish();
return node;
}
}

public Node createNode() {
Transaction tx = getGraphDb().beginTx();
Node node = null;
try {
node = graphDb.createNode();
System.out.println("new nodeId = " + node.getId());
tx.success();
} catch (Exception e) {
tx.failure();
e.printStackTrace();
} finally {
tx.finish();
return node;
}
}

public Node addNodeProperty(Node node, String propertyName, Object propertyValue) {
Transaction tx = getGraphDb().beginTx();
try {
node.setProperty(propertyName, propertyValue);
tx.success();
} catch (Exception e) {
tx.failure();
e.printStackTrace();
} finally {
tx.finish();
return node;
}
}

public void shutDown() {
graphDb.shutdown();
}

public void registerShutdownHook() {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
graphDb.shutdown();
}
});
}
}

每个辅助方法的结构几乎都与 getNode(Long id) 和 createNode() 完全相同,当然有些有更多的逻辑,但没什么复杂的,因为我只是想学习这个。

最后,我的问题是:
* 这是处理这些交易的正确方法吗?或者,我应该实现某种类型的事务管理器吗?
* 另外,我应该在每次交易后调用 shutdown 吗?
* 也许这应该在客户端 session 级别而不是应用程序级别处理?

此类保留在服务器内存中,直到服务器(http/jvm)重新启动(如果您熟悉 jsf、applicationScope),因此在每次事务后调用 shutdown 似乎有点矫枉过正。

编辑:实际上,我对下面哪个答案标记为已接受感到困惑,因为它们都在某种程度上回答了我的问题。因此,如果您想知道为什么答案没有被接受,那就是原因。

最佳答案

不要将 GraphDatabaseService 视为 SQLConnection 或类似的实例,它是一个长期存在的实例,开始频繁停止它会消除从长期存在的此类实例中获得的许多好处,并造成大量不必要的开销。

你不需要像那样调用 tx.failure() 。一个简单的:

public Node createNode() {    Transaction tx = getGraphDb().beginTx();    try {        Node node = graphDb.createNode();        System.out.println("new nodeId = " + node.getId());        tx.success();        return node;    } finally {        tx.finish();    }}

很好,因为只有调用 success() 时事务才被视为成功,否则将回滚。此外,读取操作根本不需要在事务中执行,因此:

public Node getNode(Long id) {    return getGraphDb().getNodeById(id);}

够了。

关于neo4j - 在嵌入式 Neo4j 中处理事务的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11798420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com