Star

Nebula Java Client 2.0 多次execute时报错的问题

  • nebula 版本:2.0.0
  • Java client:2.0.0-rc1
  • 部署方式(分布式 / 单机 / Docker / DBaaS):单机
  • 硬件信息
    • 磁盘( 必须为 SSD ,不支持 HDD)
    • CPU、内存信息:
  • 出问题的 Space 的创建方式
  • 问题的具体描述:

当我使用下述方式创建SPACE时会返回错误码:E_EXECUTION_ERROR(-8) SpaceNotFound

...
session.execute("CREATE SPACE IF NOT EXISTS test_0;");
session.execute("USE test_0;");
...

但当我将两个statement合并执行后,返回结果正常

session.execute("CREATE SPACE IF NOT EXISTS test_0;USE test_0;");

另外当我合理控制两个execute之间的间隔,也可以获得预期的返回

session.execute("CREATE SPACE IF NOT EXISTS test_0;");
Thread.sleep(3000)
session.execute("USE test_0;");

同样的现象还会出现在CREATE TAG和 INSERT TAG之间
请问为什么会出现上述现象?

完整测试代码如下:

public static void main(String[] args) throws UnknownHostException, NotValidConnectionException, IOErrorException, AuthFailedException, UnsupportedEncodingException, InterruptedException {
        NebulaPoolConfig nebulaPoolConfig = new NebulaPoolConfig();
        nebulaPoolConfig.setMaxConnSize(10);
        List<HostAddress> addresses = Arrays.asList(new HostAddress("172.16.100.219", 9669));
        NebulaPool pool = new NebulaPool();
        pool.init(addresses, nebulaPoolConfig);
        Session session = pool.getSession("root", "nebula", false);
        // execute("CREATE SPACE IF NOT EXISTS test_0;USE test_0;", session);
        execute("CREATE SPACE IF NOT EXISTS test_0;", session);
        execute("USE test_0;", session);
        session.release();
        pool.close();
    }

    public static void execute(String statement, Session session) throws UnsupportedEncodingException, IOErrorException {
        ResultSet resultSet = session.execute(statement);
        if (!resultSet.isSucceeded()) {
            throw new RuntimeException(String.format("Error: %s(%d) %s%n", ErrorCode.VALUES_TO_NAMES.get(resultSet.getErrorCode()), resultSet.getErrorCode(), resultSet.getErrorMessage()));
        }
    }

很感谢你的提问。这个问题原因是现在 USE SPACE 是从cache里面拿space做判断的,当你create和use合并一条语句给graphd的时候,graphd是可以根据你的上下语句分析出来你这个space是存在的。但是当你单独执行use space的时候,这个时候没有上下文,只会在cache里面拿数据。cache是需要周期加载的。

@dingding 多谢你的回答,之前也提到除了USE SPACE之外,CREATE TAG也存在类似现象,由于我的使用场景中无法预定义schema,会导致CREATE TAG后紧接着的一部分INSERT VERTEX报错,现在这种现象除了客户端自己做重试之外,还有没有更好的解决方案?以及将来会考虑对这种情况进行优化么

很抱歉,对于你现在的应用场景,我们的schema设计是不适合你的这种使用场景。我们目前主要是针对用户提前将schema创建好,后续做插入的时候,全部用的是cache的schema,这样效率才高。你的schema是每次都是新加的,又想立即插入,那只能在你业务系统做个包装,但是这样太低效了,每次要等几秒才能插入。对于schema是否要支持实时更新,这个是有考虑的,但是近期是不会做的,以后可能会。

2赞

浙ICP备20010487号