场景1:
当我在不打开事务的情况下执行以下代码时,它会成功返回书签。
Session session2 = sessionFactory.openSession();
session2.query("MATCH (n) RETURN count(n)", new HashMap<>());
String lastBookmark = session2.getLastBookmark();
System.out.println("WITHOUT" + " - " + lastBookmark);
输出:
WITHOUT - neo4j:bookmark:v1:tx6776
当我明确获取事务时,getLastBookmark()返回null。
Session session = sessionFactory.openSession();
session.beginTransaction(Transaction.Type.READ_ONLY);
session.query("MATCH (n) RETURN count(n)", new HashMap<>());
System.out.println("With" + " - " + session.getLastBookmark());
session.getTransaction().close();
输出:
With - null
无论是单线程还是多线程,都会发生这种情况。
场景2:
即使没有事务,当我尝试从多个线程执行getLastBookmark()时,它也会间歇性地返回null。
Thread t2 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
Session session = sessionFactory.openSession();
session.query("MATCH (n) RETURN count(n)", new HashMap<>());
String lastBookmark = session.getLastBookmark();
System.out.println("lastBookmark" + " - " + lastBookmark);
if (lastBookmark == null) {
throw new RuntimeException(" lastBookmark NULL");
}
}
});
Thread t1 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
Session session = sessionFactory.openSession();
session.query("MATCH (n) RETURN count(n)", new HashMap<>());
String lastBookmark = session.getLastBookmark();
System.out.println("lastBookmark" + " - " + lastBookmark);
if (lastBookmark == null) {
throw new RuntimeException(" lastBookmark NULL");
}
}
});
输出:
lastBookmark - neo4j:bookmark:v1:tx6776
lastBookmark - neo4j:bookmark:v1:tx6776
lastBookmark - neo4j:bookmark:v1:tx6776
lastBookmark - null
Exception in thread "Thread-2" java.lang.RuntimeException: lastBookmark NULL
at MyTest.lambda$testSession$4(MyTest.java:173)
at java.lang.Thread.run(Thread.java:745)
lastBookmark - neo4j:bookmark:v1:tx6776
lastBookmark - neo4j:bookmark:v1:tx6776
lastBookmark - neo4j:bookmark:v1:tx6776
lastBookmark - neo4j:bookmark:v1:tx6776
lastBookmark - neo4j:bookmark:v1:tx6776
有什么想法吗?
我正在使用neo4j-ogm-core:2.1.5&amp; neo4j-ogm-bolt-driver:2.1.5依赖。
答案 0 :(得分:1)
书签与交易相关联。它们在交易结束时由数据库发送。
如果在未事先打开事务的情况下使用query
,则自动提交事务由OGM管理(它是隐式事务)。执行query
方法后,书签即可使用。
在管理自己的事务(显式事务)时,您必须等待事务结束才能使书签可用。
关于第二点,请尝试更新驱动程序和/或OGM。如果问题仍然存在,请分享一个重现问题的示例项目(您可以使用一些模板here),最好在另一个问题中清楚。