1

我已经使用 Java-API(版本 3.0.30)实现了一个 OrientDB 客户端。我的代码大量使用自定义字段来将元数据存储到模式类。

在开发和集成测试环境中一切正常。在生产环境中,我的初始化方法在第一个setCustom将包含空格的文本写入自定义字段的命令处失败。aOCommandSQLParsingException被抛出(见下文)。

在开发/测试环境中,我使用各种数据库(嵌入式、本地和远程访问独立的 OrientDB 实例 - 在 docker 上运行)。在生产环境中,应用程序连接到多个 OrientDB 实例(所有 docker 容器)的分布式集群。这是我能发现的唯一区别。

初始化代码如下所示:

try(ODatabaseSession session = orientDbService.getSession()) {
    final String className = "mySuperClass";

    OClass oClass = session.getMetadata().getSchema().getClass(className);
    if(oClass == null) {
        oClass = session.createVertexClass(className);
        oClass.setAbstract(true);
        oClass.setCustom("myDescription", "my superclass");   // <- fails here in production
        oClass.setCustom("myCreationDate", ...

当要写入自定义字段的文本包含空格时会发生错误。没有空格的文本可以毫无问题地处理。抛出此异常:

OCommandSQLParsingException: Error parsing query:
alter class `mySuperClass` custom `myDescription`=my superclass
                                                              ^
Encountered " <IDENTIFIER> "superclass "" at line 1, column 53.
Was expecting one of:
  <EOF> 
  <UNSAFE> ...
  ";" ...
  <UNSAFE> ...
  <UNSAFE> ...

  DB name="myDb"
  Error Code="1"
    at com.orientechnologies.orient.core.sql.parser.OStatementCache.throwParsingException(OStatementCache.java:149)
    at com.orientechnologies.orient.core.sql.parser.OStatementCache.parse(OStatementCache.java:141)
    at com.orientechnologies.orient.core.sql.parser.OStatementCache.get(OStatementCache.java:90)
    at com.orientechnologies.orient.core.sql.parser.OStatementCache.get(OStatementCache.java:68)
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLAbstract.preParse(OCommandExecutorSQLAbstract.java:228)
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLAlterClass.parse(OCommandExecutorSQLAlterClass.java:60)
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLAlterClass.parse(OCommandExecutorSQLAlterClass.java:44)
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLDelegate.parse(OCommandExecutorSQLDelegate.java:58)
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLDelegate.parse(OCommandExecutorSQLDelegate.java:39)
    at com.orientechnologies.orient.server.distributed.impl.ODistributedStorage.command(ODistributedStorage.java:240)
    at com.orientechnologies.orient.core.command.OCommandRequestTextAbstract.execute(OCommandRequestTextAbstract.java:68)
    at com.orientechnologies.orient.core.metadata.schema.OClassEmbedded.setCustom(OClassEmbedded.java:198)
    at com.orientechnologies.orient.core.metadata.schema.OClassEmbedded.setCustom(OClassEmbedded.java:24)
    at com.orientechnologies.orient.core.sql.parser.OAlterClassStatement.executeDDL(OAlterClassStatement.java:318)
    at com.orientechnologies.orient.core.sql.executor.ODDLExecutionPlan.executeInternal(ODDLExecutionPlan.java:55)
    at com.orientechnologies.orient.core.sql.parser.ODDLStatement.execute(ODDLStatement.java:42)
    at com.orientechnologies.orient.core.sql.parser.OStatement.execute(OStatement.java:79)
    at com.orientechnologies.orient.core.db.document.ODatabaseDocumentEmbedded.command(ODatabaseDocumentEmbedded.java:567)
    at com.orientechnologies.orient.server.OConnectionBinaryExecutor.executeQuery(OConnectionBinaryExecutor.java:1188)
    at com.orientechnologies.orient.client.remote.message.OQueryRequest.execute(OQueryRequest.java:136)
    at com.orientechnologies.orient.server.network.protocol.binary.ONetworkProtocolBinary.sessionRequest(ONetworkProtocolBinary.java:310)
    at com.orientechnologies.orient.server.network.protocol.binary.ONetworkProtocolBinary.execute(ONetworkProtocolBinary.java:212)
    at com.orientechnologies.common.thread.OSoftThread.run(OSoftThread.java:69)

以下参数在开发、测试和生产环境中是相同的:

  • 版本:OrientDB 3.0.30(Java API,服务器)
  • Java 运行时:OpenJDK 11
  • 操作系统:Linux
4

0 回答 0