执行AQL时的ArangoDB java驱动程序有时会返回NULL,有时会返回正确的结果

时间:2016-10-23 19:10:06

标签: java arangodb

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

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

的NullPointerException
return cursor.getUniqueResult();

但也有一次ConcurrentModificationException

问题:

  1. 我是否必须管理数据库连接?喜欢关闭司机 每次使用后连接。
  2. 我做错了什么     使用ArangoDB查询?
  3. 赞赏任何正确方向的提示。

    错误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();
        }
    

1 个答案:

答案 0 :(得分:2)

正如 AntJavaDev 所说,您可以在同一时间多次访问bindVar。当一个线程修改bindVar而另一个线程尝试通过阅读ConcurrentModificationException同时构建AQL调用时。这会导致NullPointerException

bindVar来自AQL调用而没有结果。例如清除bindVar后直接清除bindVar,在java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required中没有内容的另一个线程中执行AQL。

问题: 1.不,您不必在每次通话后关闭驱动程序连接。 2.在共享No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: dataSource, anotherDataSource旁边,一切看起来都是正确的。