繁体   English   中英

ArangoDB java 驱动程序在执行 AQL 时有时会返回 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 at

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)

ArangoDB连接器

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;

}

用户DAO

@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而另一个线程试图通过读取bindVar同时构建 AQL 调用时。 这导致ConcurrentModificationException

NullPointerException来自没有结果的 AQL 调用。 例如,当您清除bindVar并直接在此之后,在bindVar没有内容的另一个线程中执行 AQL。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM