如果您通过Neo4j的Java API和Java 6使用了Neo4j的早期版本,则可能具有与以下类似的代码,以确保在事务中进行写操作:
public class StylesOfTx
{public static void main( String[] args ) throws IOException{String path = "/tmp/tx-style-test";FileUtils.deleteRecursively(new File(path));GraphDatabaseService db = new GraphDatabaseFactory().newEmbeddedDatabase( path );Transaction tx = db.beginTx();try {db.createNode();tx.success();} finally {tx.close();}}
}
在Neo4j 2.0中,Transaction开始扩展AutoCloseable ,这意味着您可以使用“尝试使用资源”,并且在块完成时将自动调用“ close”方法:
public class StylesOfTx
{public static void main( String[] args ) throws IOException{String path = "/tmp/tx-style-test";FileUtils.deleteRecursively(new File(path));GraphDatabaseService db = new GraphDatabaseFactory().newEmbeddedDatabase( path );try ( Transaction tx = db.beginTx() ){Node node = db.createNode();tx.success();}}
}
尽管人们在不使用此语法的情况下仍可以在应用程序中挂起事务,但这仍然可以很好地工作,尽管仍然可以允许使用旧样式。
在Venkat Subramaniam的Java 8书中,他提出了一种替代方法,其中我们使用基于lambda的方法:
public class StylesOfTx
{public static void main( String[] args ) throws IOException{String path = "/tmp/tx-style-test";FileUtils.deleteRecursively(new File(path));GraphDatabaseService db = new GraphDatabaseFactory().newEmbeddedDatabase( path );Db.withinTransaction(db, neo4jDb -> {Node node = neo4jDb.createNode();});}static class Db {public static void withinTransaction(GraphDatabaseService db, Consumer<GraphDatabaseService> fn) {try ( Transaction tx = db.beginTx() ){fn.accept(db);tx.success();}}}
}
实际上,“ withinTransaction”函数将在GraphDatabaseService或类似数据库上运行,而不是在该Db类上,但是对于此示例,将其放置在该函数上更容易。
这种风格的一个缺点是,您没有对处理失败案例的事务有明确的控制权–假设如果未调用'tx.success()',则事务失败并将其回滚。 我不确定到底有多少用例真正需要这种细粒度的控制。
Brian Hurt将此称为“ 中间模式的漏洞 ”,我想一旦Java 8发布并得到更广泛的使用,我们将开始看到更多类似的代码。
参考: Java 8:Lambda表达式与Auto Closeable可以从Mark Needham博客博客上的JCG合作伙伴 Mark Needham获得。
翻译自: https://www.javacodegeeks.com/2014/03/java-8-lambda-expressions-vs-auto-closeable.html