提交后如何从服务器插件中的 Neo4j 数据库获取属性?
How to get Properties from a Neo4j Database in Server Plugin after Commit?
我必须实现一个 Neo4j 服务器插件,该插件对数据库的更改做出反应并获取有关这些更改的信息。我需要获取一个事务中所有已添加、更改和删除的数据。我用一个TransactionEventHandler
注册到数据库。出于性能原因,我必须使用在对数据库进行更改后调用的 afterCommit
回调。这样交易就不会被插件阻止了。
现在在这个回调中我做了类似的事情:
public void afterCommit(TransactionData data, Void arg1) {
for(Node n:data.createdNodes()) {
String firstkey = n.getPropertyKeys().iterator().next();
}
}
但是 getPropertyKeys
抛出异常,因为事务已经提交。我不明白为什么这是个问题,我不想对事务进行任何更改,我只想要节点具有已更改的属性。有什么办法可以解决这个问题吗?异常的原因是什么?
异常:
java.lang.IllegalStateException: This transaction has already been completed.
at org.neo4j.kernel.impl.api.KernelTransactionImplementation.assertTransactionOpen(KernelTransactionImplementation.java:376)
at org.neo4j.kernel.impl.api.KernelTransactionImplementation.acquireStatement(KernelTransactionImplementation.java:261)
at org.neo4j.kernel.impl.api.KernelTransactionImplementation.acquireStatement(KernelTransactionImplementation.java:80)
at org.neo4j.kernel.impl.core.ThreadToStatementContextBridge.instance(ThreadToStatementContextBridge.java:64)
at org.neo4j.kernel.InternalAbstractGraphDatabase.statement(InternalAbstractGraphDatabase.java:785)
at org.neo4j.kernel.impl.core.NodeProxy.getPropertyKeys(NodeProxy.java:358)
at de.example.neo4jVersionControl.ChangeEventListener.afterCommit(ChangeEventListener.java:41)
在 afterCommit
中事务已经提交(因此得名)。要从节点访问属性,您需要事务上下文 - 请记住每个操作(甚至只读)都需要它。
实施 TransactionEventHandler
的推荐方法是仅依赖 TransactionData
。 TransactionData.assignedNodeProperties()
也将 return 新创建节点的属性。
我必须实现一个 Neo4j 服务器插件,该插件对数据库的更改做出反应并获取有关这些更改的信息。我需要获取一个事务中所有已添加、更改和删除的数据。我用一个TransactionEventHandler
注册到数据库。出于性能原因,我必须使用在对数据库进行更改后调用的 afterCommit
回调。这样交易就不会被插件阻止了。
现在在这个回调中我做了类似的事情:
public void afterCommit(TransactionData data, Void arg1) {
for(Node n:data.createdNodes()) {
String firstkey = n.getPropertyKeys().iterator().next();
}
}
但是 getPropertyKeys
抛出异常,因为事务已经提交。我不明白为什么这是个问题,我不想对事务进行任何更改,我只想要节点具有已更改的属性。有什么办法可以解决这个问题吗?异常的原因是什么?
异常:
java.lang.IllegalStateException: This transaction has already been completed.
at org.neo4j.kernel.impl.api.KernelTransactionImplementation.assertTransactionOpen(KernelTransactionImplementation.java:376)
at org.neo4j.kernel.impl.api.KernelTransactionImplementation.acquireStatement(KernelTransactionImplementation.java:261)
at org.neo4j.kernel.impl.api.KernelTransactionImplementation.acquireStatement(KernelTransactionImplementation.java:80)
at org.neo4j.kernel.impl.core.ThreadToStatementContextBridge.instance(ThreadToStatementContextBridge.java:64)
at org.neo4j.kernel.InternalAbstractGraphDatabase.statement(InternalAbstractGraphDatabase.java:785)
at org.neo4j.kernel.impl.core.NodeProxy.getPropertyKeys(NodeProxy.java:358)
at de.example.neo4jVersionControl.ChangeEventListener.afterCommit(ChangeEventListener.java:41)
在 afterCommit
中事务已经提交(因此得名)。要从节点访问属性,您需要事务上下文 - 请记住每个操作(甚至只读)都需要它。
实施 TransactionEventHandler
的推荐方法是仅依赖 TransactionData
。 TransactionData.assignedNodeProperties()
也将 return 新创建节点的属性。