Pourquoi ai-je access à java.lang.AbstractMethodError lorsque je tente de charger un object blob dans la firebase database?

J’ai un problème avec JDBC.

J’ai le code suivant:

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

Je reçois l’erreur suivante:

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

Ma chaîne de connexion est jdbc:oracle:oci:@.....

La version Oracle est 11g.

D’après le message d’erreur, il semble qu’il manque quelque chose mais:

  • quand je lis sur la même colonne blob (avec blob.getBytes), tout fonctionne.
  • Les DLL du client instantané sont (correctement) dans le chemin de la bibliothèque.
  • Ceci est le manifeste du JAR JDBC Oracle dans mon chemin de classe:

     Manifest-Version: 1.0 Specification-Title: Oracle JDBC driver classes 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 

    Avec JDBC, cette erreur se produit généralement car votre pilote JDBC implémente une ancienne version de l’API JDBC par rapport à celle incluse dans votre JRE. Ces anciennes versions sont correctes tant que vous n’essayez pas d’utiliser une méthode apparue dans la nouvelle API.

    Je ne sais pas dans quelle version de JDBC setBinaryStream est apparu. Cela fait un moment que je pense.

    Quoi qu’il en soit, votre version du pilote JDBC (10.2.0.4.0) est assez ancienne, je vous recommande de la mettre à niveau vers la version publiée avec 11g (téléchargement ici ), et réessayez.

    Il semble que même si le pilote 10.2 est compatible avec le JDBC3, il peut ne pas fonctionner avec JRE6 comme je l’ai trouvé ici:

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

    Quels pilotes JDBC supportent les versions du JDK de Javasoft?

    Pilotes OCI et THIN antérieurs à 8i – JDK 1.0.x et JDK 1.1.x
    8.1.5 Pilotes OCI et THIN – JDK 1.0.x et JDK 1.1.x
    8.1.6SDK THIN Driver – JDK 1.1.x et JDK 1.2.x (alias Java2)
    8.1.6SDK OCI Driver – Uniquement JDK 1.1.x
    8.1.6 Pilotes OCI et THIN – JDK 1.1.x et JDK 1.2.x
    8.1.7 Pilotes OCI et THIN – JDK 1.1.x et JDK 1.2.x
    9.0.1 Pilotes OCI et THIN – JDK 1.1.x, JDK 1.2.x et JDK 1.3.x
    9.2.0 Pilotes OCI et THIN – JDK 1.1.x, JDK 1.2.x, JDK 1.3.x et JDK 1.4.x
    10.1.0 Pilotes OCI et THIN – JDK 1.2.x, JDK 1.3.x et JDK 1.4.x
    10.2.0 Pilotes OCI et THIN – JDK 1.2.x, JDK 1.3.x, JDK 1.4.x et JDK 5.0.x
    11.1.0 Pilotes OCI et THIN – JDK 1.5.x et JDK 1.6.x

    Oracle 10.2.0 prend en charge:

    Prise en charge complète de JDBC 3.0
    Notez qu’il n’y a pas de véritable changement dans la prise en charge des éléments suivants dans la firebase database. Tout ce qui a changé, c’est que certaines méthodes qui ont précédemment lancé SQLException font maintenant quelque chose de plus raisonnable.
    la tenue des résultats
    renvoyer plusieurs ensembles de résultats.

    Voici ce que l’API JDK dit à propos de AbstractMethodError:

    Lancé lorsqu’une application tente d’appeler une méthode abstraite. Normalement, cette erreur est interceptée par le compilateur; Cette erreur ne peut se produire au moment de l’exécution que si la définition d’une classe a été modifiée de manière incompatible depuis la dernière compilation de la méthode en cours d’exécution.

    Bug dans le pilote Oracle, peut-être?

    Il suffit de mettre ojdbc6.jar dans le chemin de classe, pour que nous puissions corriger l’exception de CallbaleStatement :

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

    dans Oracle.

    Comme décrit dans l’API de java.sql.PreparedStatement.setBinaryStream() il est disponible depuis la version 1.6, il s’agit donc d’une API JDBC 4.0 ! Vous utilisez un pilote JDBC 3 afin que cette méthode ne soit pas disponible!

    Dans mon cas, c’était l’erreur.

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

    Solution: Je viens de remplacer ojdbc14.jar par ojdbc6.jar

    Utilisez simplement ojdb6.jar et corrigez tous ces problèmes.

    Pour les applications basées sur maven:

    1. Téléchargez et copiez ojdbc6.jar dans un répertoire de votre ordinateur local

    2. Depuis l’emplacement où vous avez copié votre fichier jar, installez ojdbc6.jar dans votre repository .M2 local en exécutant la commande ci-dessous: C: \ SRK \ Softwares \ Libraries> mvn install: fichier-installation -DgroupId = com.oracle -DartifactId = ojdbc6 – Dversion = 11.2.0.3 -Dpackaging = jar -Dfile = ojdbc6.jar -DgeneratePom = true

    3. Ajoutez ce qui suit dans votre projet pom.xml en tant que dépendance ojdbc6.jar

        com.oracle ojdbc6 11.2.0.3  

    PS: le problème pourrait être dû à l’utilisation de l’annotation @Lob dans JPA pour stocker des objects volumineux spécifiquement dans les colonnes oracle db. La mise à niveau vers 11.2.0.3 (ojdbc6.jar) peut résoudre le problème.

    Je suggère que vous étudiez votre chemin de classe très attentivement. Vous pouvez avoir deux versions différentes d’un fichier jar où l’une invoque des méthodes dans l’autre et l’autre méthode est abstraite.

    Dans mon cas, le problème était au fichier context.xml de mon projet.

    Ce qui suit de context.xml provoque le java.lang.AbstractMethodError , puisque nous n’avons pas affiché l’usine de source de données.

      

    Simpy ajoutant factory = “org.apache.tomcat.jdbc.pool.DataSourceFactory” a résolu le problème:

      

    Pour être sûr d’avoir reproduit le problème plusieurs fois en supprimant factory = “org.apache.tomcat.jdbc.pool.DataSourceFactory” de Resource

    Je rencontre ce problème. utilisez ojdbc14.jar et 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()); 

    au lieu de cela, vous devez utiliser

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

    Le problème est dû à l’ancienne version de ojdbc – ojdbc14.

    Placez la dernière version du fichier jar ojdbc dans votre application ou votre bibliothèque partagée. (Une seule version devrait être disponible et elle devrait être la dernière) A ce jour – ojdbc6.jar

    Vérifiez les bibliothèques d’applications et les bibliothèques partagées sur le serveur.

    Je pense que la raison de l’erreur du pilote JDBC, vous devriez obtenir un pilote JDBC approprié pour votre firebase database Oracle. Vous pouvez l’obtenir de

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

    J’ai eu le même problème et l’ai résolu.

    Pour résoudre ce problème, vous devez mettre à niveau la bibliothèque commons-dbcp vers la dernière version (1.4). Il fonctionnera avec les derniers pilotes JDBC.