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:
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
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.
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.
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?
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.
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!
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
Il suffit d'utiliser ojdb6.jar et corrigera toutes ces questions.
Pour les applications Maven:
Téléchargez et copiez ojdbc6.jar dans un répertoire de votre machine locale
À 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
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.
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.
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
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
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.
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());