Perché ottengo java.lang.AbstractMethodError quando provo a caricare un blob nel db?

Ho un problema con JDBC.

Ho il codice seguente:

//blargeparam is a blob column. PreparedStatement pst =connection.prepareStatement("update gcp_processparams_log set blargeparam= ? where idprocessparamslog=1"); pst.setBinaryStream(1,inputStream); 

Ottengo il seguente errore:

 Exception in thread "main" java.lang.AbstractMethodError: oracle.jdbc.driver.T2CPreparedStatement.setBinaryStream(ILjava/io/InputStream;)V 

La mia stringa di connessione è jdbc:oracle:oci:@.....

La versione Oracle è 11g.

Dal messaggio di errore sembra che manchi qualcosa ma:

  • quando leggo dalla stessa colonna blob (con blob.getBytes) tutto funziona.
  • Le DLL del client istantaneo sono (correttamente) nel percorso della libreria.
  • Questo è il manifest di Oracle JDBC JAR nel mio percorso di class:

     Manifest-Version: 1.0 Specification-Title: Oracle JDBC driver classs for use with JDK14 Sealed: true Created-By: 1.4.2_14 (Sun Microsystems Inc.) Implementation-Title: ojdbc14.jar Specification-Vendor: Oracle Corporation Specification-Version: Oracle JDBC Driver version - "10.2.0.4.0" Implementation-Version: Oracle JDBC Driver version - "10.2.0.4.0" Implementation-Vendor: Oracle Corporation Implementation-Time: Sat Feb 2 11:40:29 2008 

    Con JDBC, questo errore si verifica in genere perché il driver JDBC implementa una versione precedente dell’API JDBC rispetto a quella inclusa in JRE. Queste versioni precedenti vanno bene fino a quando non si tenta di utilizzare un metodo che è apparso nell’API più recente.

    Non sono sicuro di quale versione di JDBC setBinaryStream apparsa. È in giro da un po ‘, credo.

    Indipendentemente da ciò, la tua versione del driver JDBC (10.2.0.4.0) è piuttosto vecchia, ti consiglio di aggiornarla alla versione rilasciata con 11g (scarica qui ) e riprova.

    Sembra che anche se il driver 10.2 è compatibile con JDBC3, potrebbe non funzionare con JRE6 come ho trovato qui:

    http://www.oracle.com/technology/tech/java/sqlj_jdbc/htdocs/jdbc_faq.html#02_03

    Quali driver JDBC supportano quali versioni del JDK di Jajarft?

    Driver pre-8i OCI e THIN: JDK 1.0.xe JDK 1.1.x.
    8.1.5 Driver OCI e THIN: JDK 1.0.xe JDK 1.1.x.
    8.1.6 Driver THD THIN – JDK 1.1.xe JDK 1.2.x (ovvero Java2)
    8.1.6 Driver OCI SDK – Solo JDK 1.1.x
    8.1.6 Driver OCI e THIN – JDK 1.1.xe JDK 1.2.x
    8.1.7 Driver OCI e THIN – JDK 1.1.xe JDK 1.2.x
    9.0.1 Driver OCI e THIN: JDK 1.1.x, JDK 1.2.xe JDK 1.3.x
    9.2.0 Driver OCI e THIN: JDK 1.1.x, JDK 1.2.x, JDK 1.3.xe JDK 1.4.x
    Driver OCI e THIN 10.1.0 – JDK 1.2.x, JDK 1.3.xe JDK 1.4.x
    10.2.0 Driver OCI e THIN: JDK 1.2.x, JDK 1.3.x, JDK 1.4.xe JDK 5.0.x
    11.1.0 Driver OCI e THIN – JDK 1.5.xe JDK 1.6.x

    Oracle 10.2.0 supporta:

    Pieno supporto per JDBC 3.0
    Si noti che non vi è alcun cambiamento reale nel supporto per quanto segue nel database. Tutto ciò che è cambiato è che alcuni metodi che in precedenza lanciavano SQLException ora invece fanno qualcosa di più ragionevole.
    mantenimento del set-set
    restituire più set di risultati.

    Ecco cosa dice l’API JDK su AbstractMethodError:

    Generata quando un’applicazione tenta di chiamare un metodo astratto. Normalmente, questo errore viene catturato dal compilatore; questo errore può verificarsi solo in fase di esecuzione se la definizione di qualche class è stata modificata in modo incompatibile dal momento in cui il metodo attualmente in esecuzione è stato compilato l’ultima volta.

    Bug nel driver dell’oracle, forse?

    Basta mettere ojdbc6.jar nel percorso della class, in modo da poter risolvere CallbaleStatement eccezione CallbaleStatement :

     oracle.jdbc.driver.T4CPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V) 

    in Oracle.

    Come descritto nell’API di java.sql.PreparedStatement.setBinaryStream() è disponibile dalla 1.6 quindi è un’API JDBC 4.0 ! Si utilizza un driver JDBC 3 quindi questo metodo non è disponibile!

    Nel mio caso questo è stato l’errore.

    Eccezione nel thread “main” java.lang.AbstractMethodError: oracle.jdbc.driver.T4CConnection.isValid (I) Z in org.apache.tomcat.dbcp.dbcp2.DelegatingConnection.isValid (DelegatingConnection.java:917) in org.apache .tomcat.dbcp.dbcp2.PoolableConnection.validate (PoolableConnection.java:282) su org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory.validateConnection (PoolableConnectionFactory.java:356) su org.apache.tomcat.dbcp.dbcp2.BasicDataSource .validateConnectionFactory (BasicDataSource.java:2306) su org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory (BasicDataSource.java:2289) su org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource (BasicDataSource.java:2038 ) su org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection (BasicDataSource.java:1532) su beans.Test.main (Test.java:24)

    Soluzione: cambio ojdbc14.jar in ojdbc6.jar

    Basta usare ojdb6.jar e risolverà tutti questi problemi.

    Per le applicazioni basate su maven:

    1. Scarica e copia ojdbc6.jar in una directory sul tuo computer locale

    2. Dalla posizione in cui hai copiato il tuo jar installa il file ojdbc6.jar nel tuo repository .M2 locale eseguendo il comando seguente C: \ SRK \ Software> Librerie> Installazione mvn: install-file -DgroupId = com.oracle -DartifactId = ojdbc6 – Dversion = 11.2.0.3 -Dpackaging = jar -Dfile = ojdbc6.jar -DgeneratePom = true

    3. Aggiungi il sotto nel tuo progetto pom.xml come dipendenza ojdbc6.jar

        com.oracle ojdbc6 11.2.0.3  

    PS: il problema potrebbe essere dovuto all’utilizzo dell’annotazione @Lob in JPA per l’archiviazione di oggetti di grandi dimensioni specificatamente nelle colonne db di Oracle. L’aggiornamento a 11.2.0.3 (ojdbc6.jar) può risolvere il problema.

    Ti suggerirei di investigare molto attentamente il tuo percorso di class. Potresti avere due versioni diverse di un file jar in cui uno invoca metodi nell’altro e l’altro metodo è astratto.

    Nel mio caso il problema era nel file context.xml del mio progetto.

    Quanto segue da context.xml causa java.lang.AbstractMethodError , dal momento che non abbiamo mostrato la fonte dati sorgente.

      

    Simpy aggiungendo factory = “org.apache.tomcat.jdbc.pool.DataSourceFactory” ha risolto il problema:

      

    Per assicurarmi di aver riprodotto più volte il problema rimuovendo factory = “org.apache.tomcat.jdbc.pool.DataSourceFactory” da Resource

    Ho incontrato questo problema. utilizzare ojdbc14.jar e jdk 1.6

     InputStream in = new FileInputStream(file); cstmt.setBinaryStream(1, in,file.length()); // got AbstractMethodError InputStream in = new FileInputStream(file); cstmt.setBinaryStream(1, in,(int)file.length()); // no problem. 
     InputStream in = new FileInputStream(file); cstmt.setBinaryStream(1, in,file.length()); 

    invece di questo devi usarlo

     InputStream in = new FileInputStream(file); cstmt.setBinaryStream(1, in,(int)file.length()); 

    Il problema è dovuto alla versione precedente di ojdbc – ojdbc14.

    Inserisci l’ultima versione del file jar ojdbc nell’applicazione o nella libreria condivisa. (Dovrebbe essere presente solo una versione e dovrebbe essere l’ultima) A partire da oggi – ojdbc6.jar

    Controllare le librerie dell’applicazione e le librerie condivise sul server.

    Penso che, a causa dell’errore del driver JDBC, dovresti ottenere un driver JDBC adatto per il tuo db Oracle. Puoi ottenerlo da

    http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

    Ho avuto lo stesso problema e l’ho risolto.

    Per risolvere questo problema, è necessario aggiornare la libreria commons-dbcp all’ultima versione (1.4). Funzionerà con i driver JDBC più recenti.