Проблема десериализации (InvalidClassException) во время связи с удаленным хранилищем - PullRequest
0 голосов
/ 13 сентября 2018

Мы используем OrientDB в нашем продукте, и после обновления с версии 2.1.15 до версии 2.2.34 у нас возникла проблема, описанная ниже, которая возникает спорадически.Можем ли мы что-нибудь сделать, чтобы смягчить это или определить фактический источник ошибок?Мы благодарны за любую помощь!

Примечание: Это кросс-пост https://groups.google.com/forum/#!topic/orient-database/8UE029Na4jE.

Наши попытки воспроизвести проблему пока были очень неудовлетворительными.Тем не менее, проблема возникает снова и снова (без распознаваемого шаблона), в разных средах выполнения разных клиентов и в разных ситуациях.Кажется, это происходит в случайных ситуациях, когда к базе данных обращаются.Бывает, что один запрос выполнен успешно, а следующий - неудачно (с указанной ниже ошибкой), а затем каждый последующий запрос также завершается неудачей.

Симптомы: Иногда при запросе базы данных возникает исключение InvalidClassException:

Caused by: com.orientechnologies.common.io.OIOException: com.o; serializable and externalizable flags conflict
    at com.orientechnologies.orient.client.remote.OStorageRemote.handleIOException(OStorageRemote.java:321)
    at com.orientechnologies.orient.client.remote.OStorageRemote.baseNetworkOperation(OStorageRemote.java:292)
    at com.orientechnologies.orient.client.remote.OStorageRemote.networkOperationRetry(OStorageRemote.java:204)
    at com.orientechnologies.orient.client.remote.OStorageRemote.networkOperation(OStorageRemote.java:215)
    at com.orientechnologies.orient.client.remote.OStorageRemote.command(OStorageRemote.java:1187)
    at com.orientechnologies.orient.core.command.OCommandRequestTextAbstract.execute(OCommandRequestTextAbstract.java:69)
    at com.tinkerpop.blueprints.impls.orient.OrientGraphCommand.execute(OrientGraphCommand.java:49)
    at com.mycompany.BaseDAOImpl.query(OrientConnection.java:188)
    ... 13 common frames omitted
Caused by: java.io.InvalidClassException: com.o; serializable and externalizable flags conflict
    at java.base/java.io.ObjectStreamClass.readNonProxy(Unknown Source)
    at java.base/java.io.ObjectInputStream.readClassDescriptor(Unknown Source)
    at java.base/java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.base/java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
    at com.orientechnologies.orient.client.binary.OChannelBinaryAsynchClient.throwSerializedException(OChannelBinaryAsynchClient.java:436)
    at com.orientechnologies.orient.client.binary.OChannelBinaryAsynchClient.handleStatus(OChannelBinaryAsynchClient.java:400)
    at com.orientechnologies.orient.client.binary.OChannelBinaryAsynchClient.beginResponse(OChannelBinaryAsynchClient.java:283)
    at com.orientechnologies.orient.client.binary.OChannelBinaryAsynchClient.beginResponse(OChannelBinaryAsynchClient.java:167)
    at com.orientechnologies.orient.client.remote.OStorageRemote.beginResponse(OStorageRemote.java:2365)
    at com.orientechnologies.orient.client.remote.OStorageRemote$27.execute(OStorageRemote.java:1211)
    at com.orientechnologies.orient.client.remote.OStorageRemote$2.execute(OStorageRemote.java:207)
    at com.orientechnologies.orient.client.remote.OStorageRemote.baseNetworkOperation(OStorageRemote.java:252)
    ... 19 common frames omitted

BaseDAOImpl.query выглядит следующим образом:

public Iterable<Vertex> query(String query, Object... params) throws PersistenceException {
    OrientBaseGraph graph = OrientGraph.getActiveGraph();
    try {
        OCommandSQL command = new OCommandSQL(query);
        graph.clearCache();
        return graph.command(command).execute(params);
    } catch (Exception e) {
        throw new PersistenceException("Query triggered an exception", e);
    }
}

Он вызывается в следующем контексте:

OrientGraphFactory factory = new OrientGraphFactory("remote:localhost/mydb", user, password).setupPool(10, 50);
setRequireTransaction(true);
setAutoStartTx(false);
OrientGraph db = factory.getTx();
...
baseDAO.query("select from MyClass");
...
db.shutdown();
...