web-dev-qa-db-fra.com

Pourquoi est-ce que j'obtiens Java.lang.AbstractMethodError lorsque j'essaie de charger un blob dans la base de données?

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);         

J'obtiens 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 que quelque chose manque, mais:

  • quand je lis dans la même colonne blob (avec blob.getBytes) tout fonctionne.
  • Les DLL du client instantané se trouvent (correctement) dans le chemin de la bibliothèque.
  • Voici le manifeste du JAR Oracle JDBC 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  
    
45
mic.sca

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_

Quels pilotes JDBC prennent en charge quelles versions du JDK de Javasoft?

pilotes OCI et THIN pré-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 - JDK 1.1.x uniquement
8.1.6 OCI et THIN Driver - JDK 1.1.x et JDK 1.2.x
8.1.7 Pilote OCI et THIN - JDK 1.1.x et JDK 1.2.x
9.0.1 OCI et THIN Driver - JDK 1.1.x, JDK 1.2.x et JDK 1.3.x
9.2.0 OCI et THIN Driver - JDK 1.1.x, JDK 1.2.x, JDK 1.3.x et JDK 1.4.x
10.1.0 OCI et THIN Driver - JDK 1.2.x, JDK 1.3.x et JDK 1.4.x
10.2.0 OCI et THIN Driver - JDK 1.2.x, JDK 1.3.x, JDK 1.4.x et JDK 5.0.x
11.1.0 OCI et THIN Driver - 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 réel changement dans la prise en charge des éléments suivants dans la base de données. Tout ce qui a changé, c'est que certaines méthodes qui lançaient auparavant SQLException font désormais quelque chose de plus raisonnable.
tenue des ensembles de résultats
renvoyant plusieurs jeux de résultats.

11
mic.sca

Avec JDBC, cette erreur se produit généralement car votre pilote JDBC implémente une version plus ancienne de l'API JDBC que 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 apparue. Elle existe depuis un certain temps, je pense.

Quoi qu'il en soit, la version de votre 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.

64
skaffman

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 détecté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 changé de manière incompétente depuis la dernière compilation de la méthode en cours d'exécution.

Bug dans le pilote Oracle, peut-être?

6
Steve B.

Mettez simplement ojdbc6.jar dans le chemin d'accès aux classes, afin que nous puissions corriger CallbaleStatement exception:

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

dans Oracle.

4
Sudarsan

Comme décrit dans l'API de Java.sql.PreparedStatement.setBinaryStream() il est disponible depuis 1.6 donc c'est un API JDBC 4.! Vous utilisez un JDBC 3 Driver donc cette méthode n'est pas disponible!

3
Arne Burmeister

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

Exception dans le thread "principal" Java.lang.AbstractMethodError: Oracle.jdbc.driver.T4CConnection.isValid (I) Z at org.Apache.Tomcat.dbcp.dbcp2.DelegatingConnection.isValid (DelegatingConnection.Java:917) at org.Apache .Tomcat.dbcp.dbcp2.PoolableConnection.validate (PoolableConnection.Java:282) sur org.Apache.Tomcat.dbcp.dbcp2.PoolableConnectionFactory.validateConnection (PoolableConnectionFactory.Java:356) sur org.Apache.Tomcatcb2.pc .validateConnectionFactory (BasicDataSource.Java:2306) à org.Apache.Tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory (BasicDataSource.Java:2289) à org.Apache.Tomcat.dbcp.dbcp2.BasicDataSource.createSource20 Source (Java) ) sur org.Apache.Tomcat.dbcp.dbcp2.BasicDataSource.getConnection (BasicDataSource.Java:1532) sur beans.Test.main (Test.Java:24)

Solution: Je viens de changer ojdbc14.jar à ojdbc6.jar

2
MayurChovatiya

Il suffit d'utiliser ojdb6.jar et corrigera toutes ces questions.

Pour les applications Maven:

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

  2. À partir de l'emplacement où vous avez copié votre fichier jar, installez ojdbc6.jar dans votre dépôt .M2 local en exécutant la commande ci-dessous C:\SRK\Softwares\Libraries> mvn install: install-file -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

    <dependency>
        <groupId>com.Oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.3</version>
    </dependency>
    

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

2
Shoaib Khan

Je suggérerais d'étudier très attentivement votre chemin de classe. 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.

1

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

Ce qui suit dans context.xml provoque Java.lang.AbstractMethodError, puisque nous n'avons pas montré la fabrique de sources de données.

<Resource name="jdbc/myoracle"
              auth="Container"
              type="javax.sql.DataSource"
              driverClassName="Oracle.jdbc.OracleDriver"
              url="jdbc:Oracle:thin:@(DESCRIPTION = ... "
              username="****" password="****" maxActive="10" maxIdle="1"
              maxWait="-1" removeAbandoned="true"/> 

L'ajout de Simpy factory = "org.Apache.Tomcat.jdbc.pool.DataSourceFactory" a résolu le problème:

<Resource name="jdbc/myoracle"
              auth="Container"
              factory="org.Apache.Tomcat.jdbc.pool.DataSourceFactory"  type="javax.sql.DataSource"
              driverClassName="Oracle.jdbc.OracleDriver"
              url="jdbc:Oracle:thin:@(DESCRIPTION = ... "
              username="****" password="****" maxActive="10" maxIdle="1"
              maxWait="-1" removeAbandoned="true"/>

Pour m'assurer d'avoir reproduit le problème plusieurs fois en supprimant factory = "org.Apache.Tomcat.jdbc.pool.DataSourceFactory" de Resource

1
valijon

Je pense que, la raison de l'erreur du pilote JDBC, vous devriez obtenir un pilote JDBC approprié pour votre base de données Oracle. Vous pouvez l'obtenir auprès de

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

0
ArmağaN OlsuN

Le problème est dû à une ancienne version de ojdbc - ojdbc14.

Placez la dernière version du fichier jar ojdbc dans votre application ou bibliothèque partagée. (Une seule version devrait être là et ce devrait être la dernière) À partir d'aujourd'hui - ojdbc6.jar

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

0
Teddy

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.
0
niwotu
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());  
0