ArangoDB java 驱动程序在执行 AQL 时有时 return NULL 有时是正确的结果

ArangoDB java driver on executing AQL sometimes return NULL and other times the correct result

我无法解决这个特殊问题。 我正在使用 arangodb 3.0.10 和 arangodb-java-driver 3.0.4。

我正在执行一个非常简单的 AQL 提取查询。 (见下面的代码)我所有的单元测试每次都通过,调试时从未出现问题。问题不会一直发生(大约一半的时间)。它变得更加奇怪,最常见的表现是

处的 NullPointerException
return cursor.getUniqueResult();

但也有过一次ConcurrentModificationException

问题:

  1. 我必须管理数据库连接吗?比如关闭驱动 每次使用后连接。
  2. 我是不是做错了什么 使用 ArangoDB 查询?

如有任何正确方向的提示,我们将不胜感激。

错误 1:

java.lang.NullPointerException
            at org.xworx.sincapp.dao.UserDAO.get(UserDAO.java:41)

错误2:

java.util.ConcurrentModificationException
        at java.util.HashMap$HashIterator.nextNode(HashMap.java:1437)
        at java.util.HashMap$EntryIterator.next(HashMap.java:1471)
        at java.util.HashMap$EntryIterator.next(HashMap.java:1469)
        at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:206)
        at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
        at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208)
        at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
        at com.google.gson.Gson.toJson(Gson.java:593)
        at com.google.gson.Gson.toJson(Gson.java:572)
        at com.google.gson.Gson.toJson(Gson.java:527)
        at com.google.gson.Gson.toJson(Gson.java:507)
        at com.arangodb.entity.EntityFactory.toJsonString(EntityFactory.java:201)
        at com.arangodb.entity.EntityFactory.toJsonString(EntityFactory.java:165)
        at com.arangodb.impl.InternalCursorDriverImpl.getCursor(InternalCursorDriverImpl.java:94)
        at com.arangodb.impl.InternalCursorDriverImpl.executeCursorEntityQuery(InternalCursorDriverImpl.java:79)
        at com.arangodb.impl.InternalCursorDriverImpl.executeAqlQuery(InternalCursorDriverImpl.java:148)
        at com.arangodb.ArangoDriver.executeAqlQuery(ArangoDriver.java:2158)
        at org.xworx.sincapp.dao.UserDAO.get(UserDAO.java:41)

ArangoDBConnector

public abstract class ArangoDBConnector {

protected static ArangoDriver driver;
protected static ArangoConfigure configure;

public ArangoDBConnector() {
    final ArangoConfigure configure = new ArangoConfigure();
    configure.loadProperties(ARANGODB_PROPERTIES);
    configure.init();
    final ArangoDriver driver = new ArangoDriver(configure);

    ArangoDBConnector.configure = configure;
    ArangoDBConnector.driver = driver;

}

UserDAO

@Named
public class UserDAO extends ArangoDBConnector{

    private Map<String, Object> bindVar = new HashMap();

    public UserDAO() {}

    public User get(@NotNull String objectId) {
        bindVar.clear();
        bindVar.put("uuid", objectId);
        String fetchUserByObjectId = "FOR user IN User FILTER user.uuid == @uuid RETURN user";
        CursorResult<User> cursor = null;
        try {
            cursor = driver.executeAqlQuery(fetchUserByObjectId, bindVar, driver.getDefaultAqlQueryOptions(), User.class);
        } catch (ArangoException e) {
            new ArangoDaoException(e.getErrorMessage());
        }
        return cursor.getUniqueResult();
    }

正如 AntJavaDev 所说,您同时访问 bindVar 不止一次。当一个线程修改 bindVar 而另一个线程试图通过读取 bindVar 同时构建 AQL 调用时。这导致 ConcurrentModificationException.

NullPointerException 是 AQL 调用的结果,但没有结果。例如当您清除 bindVar 并紧接着,在 bindVar.

中没有内容的另一个线程中执行 AQL

针对您的问题: 1. 不,您不必在每次调用后关闭驱动程序连接。 2.除了共享的bindVar,一切看起来都是正确的。