我已经使用 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