Apache NiFi: Convertir JSONtoSQL (database Oracle)

Je voulais convertir ma string JSON en instruction SQL en utilisant le processeur ConvertJSONtoSQL. exemple: string JSON –

{"cpuwait":"0.0","servernamee":"mywindows","cpusys":"5.3","cpuidle":"77.6","datee":"29-SEP-2016","timee":"00:01:33","cpucpuno":"CPU01","cpuuser":"17.1"} 

Structure de la table en oracle db –

 CREATE TABLE cpu ( datee varchar2(15) DEFAULT NULL, timee varchar2(10) DEFAULT NULL, servernamee varchar2(20) DEFAULT NULL, cpucpuno varchar2(4) DEFAULT NULL, cpuuser varchar2(5) DEFAULT NULL, cpusys varchar2(5) DEFAULT NULL, cpuwait varchar2(5) DEFAULT NULL, cpuidle varchar2(5) DEFAULT NULL ); 

Configuration utilisée pour la database MySQL:

URL de connection à la database: jdbc: mysql: // localhost: 3306 / testnifi

Nom de la class du pilote de database: com.mysql.jdbc.Driver

J'ai été connecté avec succès à MySQL en utilisant l'URL JDBC (pool de connection DBCP), le nom d'user et le mot de passe. Le processeur ConvertJSONtoSQL a fonctionné avec succès et j'obtiens une instruction d'insertion sql valide en sortie. Mais quand je tentais la même chose avec Oracle Database, je reçois

ERREUR [Thread de process piloté par timer] oanpstandard.ConvertJSONToSQL java.sql.SQLException: le stream a déjà été fermé

Ma configuration pour la connection Oracle db:

Configuration du processeur ConvertJSONtoSQL

DBCP config

J'ai recherché l'erreur dans google mais j'ai trouvé que cette erreur se produira quand de longs types de données ont été employés dans des tables de database mais je ne les emploie pas. Je suis allé à travers le code source du processeur ConvertJSONtoSQL (suivi de la trace de la stack) et j'ai essayé d'implémenter la même chose dans Eclipse où je ne reçois aucune erreur, je peux me connecter à la database et faire des requêtes.

Y a-t-il une erreur dans ma configuration?

Version Nifi – 0.7.0 / 1.0 (je reçois la même erreur dans les deux)

version java – java8

Version Oracle DB – Oracle Database 11g Express Edition

Trace de stack complète:

2016-10-19 07: 10: 06,557 ERREUR [Thread Thread-6 piloté par timer] oanpstandard.ConvertJSONToSQL java.sql.SQLException: Stream a déjà été fermé à oracle.jdbc.driver.LongAccessor.getBytesInternal (LongAccessor.java:156 ) ~ [ojdbc6.jar: 11.2.0.1.0] à oracle.jdbc.driver.LongAccessor.getBytes (LongAccessor.java:126) ~ [ojdbc6.jar: 11.2.0.1.0] à oracle.jdbc.driver.LongAccessor .getSsortingng (LongAccessor.java:201) ~ [ojdbc6.jar: 11.2.0.1.0] at oracle.jdbc.driver.T4CLongAccessor.getSsortingng (T4CLongAccessor.java:427) ~ [ojdbc6.jar: 11.2.0.1.0] à oracle.jdbc.driver.OracleResultSetImpl.getSsortingng (OracleResultSetImpl.java:1251) ~ [ojdbc6.jar: 11.2.0.1.0] à oracle.jdbc.driver.OracleResultSet.getSsortingng (OracleResultSet.java:494) ~ [ojdbc6. jar: 11.2.0.1.0] à org.apache.commons.dbcp.DelegatingResultSet.getSsortingng (DelegatingResultSet.java:263) ~ [na: na] à org.apache.nifi.processors.standard.ConvertJSONToSQL $ ColumnDescription.from ( ConvertJSONToSQL.java:677) ~ [nifi-standard-processors-0.7.0.jar: 0.7.0] sur org.apache.nif i.processors.standard.ConvertJSONToSQL $ TableSchema.from (ConvertJSONToSQL.java:621) ~ [nifi-standard-processeurs-0.7.0.jar: 0.7.0] à org.apache.nifi.processors.standard.ConvertJSONToSQL.onTrigger (ConvertJSONToSQL.java:267) ~ [nifi-standard-processors-0.7.0.jar: 0.7.0] à org.apache.nifi.processor.AbstractProcessor.onTrigger (AbstractProcessor.java:27) [nifi-api-0.7 .0.jar: 0.7.0] sur org.apache.nifi.controller.StandardProcessorNode.onTrigger (StandardProcessorNode.java:1054) [nifi-framework-core-0.7.0.jar: 0.7.0] sur org.apache. nifi.controller.tasks.ContinuallyRunProcessorTask.call (ContinuallyRunProcessorTask.java:136) [nifi-framework-core-0.7.0.jar: 0.7.0] sur org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call (ContinuallyRunProcessorTask. java: 47) [nifi-framework-core-0.7.0.jar: 0.7.0] à org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent $ 1.run (TimerDrivenSchedulingAgent.java:127) [nifi-framework-core- 0.7.0.jar: 0.7.0] sur java.util.concurrent.Executors $ RunnableAdapter.call (Source inconnue) [na: 1.7.0_40] at java.util.concurrent.FutureTask.runAndReset (source inconnue) [na: 1.7.0_40] at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301 (source inconnue) [ na: 1.7.0_40] at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run (source inconnue) [na: 1.7.0_40] at java.util.concurrent.ThreadPoolExecutor.runWorker (source inconnue) [na: 1.7.0_40] à java.util.concurrent.ThreadPoolExecutor $ Worker.run (source inconnue) [na: 1.7.0_40] à java.lang.Thread.run (source inconnue) [na: 1.7.0_40

Cela semble un bug dans le pilote Oracle. Voir:

  1. https://blog.jooq.org/2015/12/30/oracle-long-and-long-raw-causing-stream-has-already-been-closed-exception/
    1. Hibernate type personnalisé pour éviter 'Causé par: java.sql.SQLException: Stream a déjà été fermé'

L'article 2 me donne la solution de contournement. Fondamentalement append dans bootstrap.conf l'argument suivant:

 java.arg.xx=-Doracle.jdbc.useFetchSizeWithLongColumn=true