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