API-метод OClass.setCustom не работает в распределенной среде при попытке записать текст, содержащий пробелы

Я реализовал клиент OrientDB с использованием Java-API (версия 3.0.30). В моем коде интенсивно используются настраиваемые поля для хранения метаданных в классах схемы.

В тестовой среде разработки и интеграции все работает нормально. В производственной среде мой метод инициализации дает сбой при первомsetCustomкоманда, которая записывает текст, содержащий пробелы, в поле cutom. АOCommandSQLParsingException брошено (см. ниже).

В среде разработки / тестирования я использую всевозможные базы данных (встроенные, локальные и удаленный доступ к автономному экземпляру OrientDB - работающему на докере). В производственной среде приложение подключается к распределенному кластеру из нескольких экземпляров OrientDB (все контейнеры докеров). Это единственная разница, которую я могу заметить.

Код инициализации выглядит так:

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

0 ответов

Другие вопросы по тегам