Оператор не может быть выполнен, повторите попытку: oracle.kv.FaultException: такого объекта нет в таблице (12.1.4.3.11) (18.3.10) - PullRequest
0 голосов
/ 07 марта 2019

Я использую Docker контейнер, содержащий базу данных Oracle NoSQL. Я пытаюсь создать таблицу и заполнить некоторые записи с помощью программы Java.

Данные, которые я пытаюсь сохранить, представляют собой метаданные из твита, хранящегося в файле JSON, но для простоты я подготовил демонстрацию с гораздо более простым примером. В этой демонстрации я постараюсь создать и заполнить таблицу, содержащую только 4 поля, и очень простой файл JSON с данными для хранения. Вот код:

private static void demo(KVStore kvstore, String file2load) {
    //Creating the table
    String query = "CREATE TABLE Carros (plate STRING, brand STRING, owner STRING, km NUMBER, primary key (plate))";
    try {
        kvstore.executeSync(query);
    } catch (IllegalArgumentException e) {
        System.out.println("Invalid statement:\n" + e.getMessage());
    } catch (FaultException e) { //ATENTION HERE <-
        System.out.println("Statement couldn't be executed, please retry: " + e);
    }
    System.out.println("Table created");
    //Fill up the table
    populateTable(kvstore, file2load);
    System.exit(0);
}

То, что вы видите выше, это метод, вызываемый в main. Теперь я также оставлю здесь метод populateTable (), хотя он отлично работает:

private static void populateTable(KVStore kvstore, String file2load) {
    TableAPI tableH = kvstore.getTableAPI();
    Table myTable = tableH.getTable("Carros");

    BufferedReader br = null;
    FileReader fr = null;

    try {
        String jObj = "";
        String currLine;
        int tCount = 0;
        boolean buildObj = false;
        boolean beganParsing = false;

        fr = new FileReader(file2load);
        br = new BufferedReader(fr);

        while ((currLine = br.readLine()) != null) {
            tCount += countParens(currLine, '{'); 

            if ((currLine = br.readLine()) == "\n") {
                continue;
            }

            if (tCount > 0) {
                buildObj = true;
                beganParsing = true;
            }
            //Anadimos la linea leida
            if (buildObj) {
                jObj += currLine;
            }

            tCount -= countParens(currLine, '}');
            if (tCount < 1)
                buildObj = false;


            if (beganParsing && !buildObj) {
                Row row = myTable.createRowFromJson(jObj, false);
                tableH.put(row, null, null);
                jObj = "";
            }
        }//While

    } catch (FileNotFoundException fnfe) {
        System.out.println("File not found: " + fnfe);
        System.exit(-1);
    } catch (IOException ioe) {
        System.out.println("IOException: " + ioe);
        System.exit(-1);
    } finally {
        try {
            if (br != null)
                br.close();
            if (fr != null)
                fr.close();
        } catch (IOException iox) {
            System.out.println("IOException on close: " + iox);
        }
    }
}//populateTable

Итак, моя проблема в том, что каждый раз, когда я выполняю эту программу, она без проблем достигает конца выполнения, потому что я использую блоки try-catch, однако она не создает и не заполняет какую-либо таблицу. Я получаю сообщение:

Оператор не может быть выполнен, повторите попытку: oracle.kv.FaultException: такого объекта нет в таблице (12.1.4.3.11) (18.3.10) Имя класса ошибки: oracle.kv.impl.admin.AdminFaultException

Я прокомментировал исключение, которое вызывает это, в первом фрагменте кода выше. Поскольку я не нашел успеха в поиске этой проблемы, я удалил try-catch, чтобы получить более подробную трассировку ошибок:

Исключение в потоке "main" oracle.kv.FaultException: в таблице нет такого объекта (12.1.4.3.11) (18.3.10) Имя класса ошибки: oracle.kv.impl.admin.AdminFaultException в oracle.kv.impl.client.admin.DdlStatementExecutor.executeDdl (DdlStatementExecutor.java:400) в oracle.kv.impl.api.KVStoreImpl.executeDdl (KVStoreImpl.java:3242) в oracle.kv.impl.api.KVStoreImpl.execute (KVStoreImpl.java:3157) в oracle.kv.impl.api.KVStoreImpl.executeSync (KVStoreImpl.java:3328) в oracle.kv.impl.api.KVStoreImpl.executeSync (KVStoreImpl.java:3321) at writer_v01.demo (writer_v01.java:267) at writer_v01.main (writer_v01.java:51) Причина: нет такого объекта в таблице (12.1.4.3.11) java.rmi.NoSuchObjectException: такого объекта нет в таблице at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer (StreamRemoteCall.java:283) at sun.rmi.transport.StreamRemoteCall.executeCall (StreamRemoteCall.java:260) at sun.rmi.server.UnicastRef.invoke (UnicastRef.java:161) в java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod (RemoteObjectInvocationHandler.java:227) в java.rmi.server.RemoteObjectInvocationHandler.invoke (RemoteObjectInvocationHandler.java:179) на com.sun.proxy. $ Proxy23.getSerialVersion (неизвестный источник) в oracle.kv.impl.util.registry.RemoteAPI. (RemoteAPI.java:40) в oracle.kv.impl.sna.StorageNodeAgentAPI. (StorageNodeAgentAPI.java:95) в oracle.kv.impl.sna.StorageNodeAgentAPI.wrap (StorageNodeAgentAPI.java:104) в oracle.kv.impl.util.registry.RegistryUtils.getStorageNodeAgent (RegistryUtils.java:577) в oracle.kv.impl.admin.Admin.getSNStatus (Admin.java:3973) в oracle.kv.impl.admin.Admin.getSNsVersion (Admin.java:3938) в oracle.kv.impl.admin.Admin.getStoreVersion (Admin.java:3781) в oracle.kv.impl.admin.plan.TablePlanGenerator.checkStoreVersion (TablePlanGenerator.java:122) в oracle.kv.impl.admin.plan.TablePlanGenerator.createAddTablePlan (TablePlanGenerator.java:100) в oracle.kv.impl.admin.plan.Planner.createAddTablePlan (Planner.java:493) в oracle.kv.impl.admin.TableDdlOperation $ CreateTable.perform (TableDdlOperation.java:97) в oracle.kv.impl.admin.DdlHandler $ DdlOperationExecutor.execute (DdlHandler.java:645) в oracle.kv.impl.admin.DdlHandler.handleResults (DdlHandler.java:293) на oracle.kv.impl.admin.DdlHandler. (DdlHandler.java:105) в oracle.kv.impl.admin.Admin.executeStatement (Admin.java:4488)в oracle.kv.impl.admin.ClientAdminServiceImpl $ 1.execute (ClientAdminServiceImpl.java:65) в oracle.kv.impl.admin.ClientAdminServiceImpl $ 1.execute (ClientAdminServiceImpl.java:62) в oracle.kault.v.execute (ProcessFaultHandler.java:118) в oracle.kv.impl.admin.ClientAdminServiceImpl.execute (ClientAdminServiceImpl.java:62) в sun.reflect.GeneratedMethodAccessor176.invoke (НеизвестныйИмпортируемый ответ на запрос.java: 43) в java.lang.reflect.Method.invoke (Method.java:498) в oracle.kv.impl.security.MethodHandlerUtils.invokeMethod (MethodHandlerUtils.java:44) в oracle.kv.impl.security.SecureProxy $ CheckingHandler.invoke (SecureProxy.java:559) в oracle.kv.impl.security.SecureProxy.invoke (SecureProxy.java:114) в com.sun.proxy. $ Proxy18.execute (Неизвестный источник) в sun.reflect.GeneratedMethodAccessor176.invoke (неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в sun.rmi.server.UnicastServerRef.dispatch (UnicastServerRef.java:357) в sun.rmi.transport.Transport $ 1.run (Transport.java:200)) на sun.rmi.transport.Transport $ 1.run (Transport.java:197) на java.security.AccessController.doPrivileged (собственный метод) на sun.rmi.transport.Transport.serviceCall (Transport.java:196) на солнце.rmi.transport.tcp.TCPTransport.handleMessages (TCPTransport.java:573) в sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0 (TCPTransport.java:834) в sun.rmi.transport.tcp.TCPTransport $.lambda $ run $ 0 (TCPTransport.java:688) в java.security.AccessController.doPrivileged (собственный метод) в sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run (TCPTransport.java:687) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624) в java.lang.Thread.run (Thread.java:7v at).impl.admin.Admin.getSNStatus (Admin.java:3975) в oracle.kv.impl.admin.Admin.getSNsVersion (Admin.java:3938) в oracle.kv.impl.admin.Admin.getStoreVersion (Admin.java:3781) в oracle.kv.impl.admin.plan.TablePlanGenerator.checkStoreVersion (TablePlanGenerator.java:122) при oracle.kv.impl.admin.plan.TablePlanGenerator.createAddTablePlan (TablePlanGenerator.java:100) при oracle.kv.impl.admin.plan.Plannerс) в oracle.kv.impl.admin.DdlHandler.handleResults (DdlHandler.java:293) в oracle.kv.impl.admin.DdlHandler. (DdlHandler.java:105) в oracle.kv.impl.admin.Admin.executeStatement(Admin.java:4488) в oracle.kv.impl.admin.ClientAdminServiceImpl $ 1.execute (ClientAdminServiceImpl.java:65) в oracle.kv.impl.admin.ClientAdminServiceImpl $ 1.execute (ClientAdminServiceI62l).kv.impl.fault.ProcessFaultHandler.exeCute (ProcessFaultHandler.java:118) в oracle.kv.impl.admin.ClientAdminServiceImpl.execute (ClientAdminServiceImpl.java:62) в sun.reflect.GeneratedMethodAccessor176.invoke (Неизвестный источник) ПоступлениеJava: 43) в java.lang.reflect.Method.invoke (Method.java:498) в oracle.kv.impl.security.MethodHandlerUtils.invokeMethod (MethodHandlerUtils.java:44) в oracle.kv.impl.security.SecureProxy$ CheckingHandler.invoke (SecureProxy.java:559)в oracle.kv.impl.security.SecureProxy.invoke (SecureProxy.java:114) на com.sun.proxy. $ Proxy18.execute (неизвестный источник) at sun.reflect.GeneratedMethodAccessor176.invoke (неизвестный источник) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) at sun.rmi.server.UnicastServerRef.dispatch (UnicastServerRef.java:357) на sun.rmi.transport.Transport $ 1.run (Transport.java:200) на sun.rmi.transport.Transport $ 1.run (Transport.java:197) at java.security.AccessController.doPrivileged (собственный метод) at sun.rmi.transport.Transport.serviceCall (Transport.java:196) в sun.rmi.transport.tcp.TCPTransport.handleMessages (TCPTransport.java:573) в sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0 (TCPTransport.java:834) на sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.lambda $ run $ 0 (TCPTransport.java:688) at java.security.AccessController.doPrivileged (собственный метод) в sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run (TCPTransport.java:687) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624) на java.lang.Thread.run (Thread.java:748) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer (StreamRemoteCall.java:283) at sun.rmi.transport.StreamRemoteCall.executeCall (StreamRemoteCall.java:260) at sun.rmi.server.UnicastRef.invoke (UnicastRef.java:161) в java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod (RemoteObjectInvocationHandler.java:227) в java.rmi.server.RemoteObjectInvocationHandler.invoke (RemoteObjectInvocationHandler.java:179) на com.sun.proxy. $ Proxy2.execute (неизвестный источник) at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в oracle.kv.impl.security.MethodHandlerUtils.invokeMethod (MethodHandlerUtils.java:44) в oracle.kv.impl.security.ContextProxy $ ContextMethodHandler.invoke (ContextProxy.java:197) в oracle.kv.impl.security.ContextProxy.invoke (ContextProxy.java:61) на com.sun.proxy. $ Proxy2.execute (неизвестный источник) в oracle.kv.impl.client.admin.ClientAdminServiceAPI.execute (ClientAdminServiceAPI.java:111) в oracle.kv.impl.client.admin.DdlStatementExecutor.executeDdl (DdlStatementExecutor.java:363) ... еще 6 Я искал несколько дней, почему это не работает. Более того, я даже не могу выполнять операции на терминале kv, как

execute "CREATE TABLE ....."

Потому что это тоже не сработало. Есть идеи? Заранее спасибо.

1 Ответ

0 голосов
/ 12 марта 2019

Эта проблема решается при введении объявления переменной query внутри блока try; другими словами:

private static void demo(KVStore kvstore, String file2load) {
//Creating the table
String query;
try {
query = "CREATE TABLE Carros (plate STRING, brand STRING, owner STRING, km NUMBER, primary key (plate))";
    kvstore.executeSync(query);
} catch (IllegalArgumentException e) {
    System.out.println("Invalid statement:\n" + e.getMessage());
} catch (FaultException e) { //ATENTION HERE <-
    System.out.println("Statement couldn't be executed, please retry: " + e);
}
System.out.println("Table created");
//Fill up the table
populateTable(kvstore, file2load);
System.exit(0);
}

Однако, если вы выполните команду:

выполнить «SELECT * FROM Carros»

вернет вам 0 строк, НО, если вы увидите таблицу через SQLDeveloper, вы увидите, что она создана правильно и также содержит данные, представленные в файле JSON. Я пришел к выводу, что это действительно ошибка.

Я рекомендую всем, у кого возникла та же проблема, что и @ user207421 в своем комментарии, открыть отчет об ошибках Oracle.

...