2009-07-28 8 views
37

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

I'have il seguente codice:

//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 

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

La versione di Oracle 11g è.

dal messaggio di errore sembra che qualcosa manca, ma:

  • quando ho letto dalla stessa colonna blob (con blob.getBytes) tutto funziona.
  • Le DLL del client istantaneo sono (correttamente) nel percorso della libreria.
  • Questo è il manifesto della Oracle JDBC JAR nel mio percorso di 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 
    
+0

Immagino che tu abbia risolto questo molto tempo fa, ma per coloro che vengono qui ora. La soluzione può essere trovata qui: http://stackoverflow.com/a/27847317/511976 – mhvelplund

risposta

10

Sembra che, anche se il driver 10.2 è compatibile con il 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 JDBC supporto driver quali versioni di JDK di Javasoft ?

OCI pre-8i e Thin Driver - JDK 1.0.x e 1.1.x JDK
8.1.5 OCI e driver SOTTILE - JDK 1.0.x e 1.1.x JDK
8.1.6SDK SOTTILE driver - JDK 1.1 .x e JDK 1.2.x (aka Java2)
8.1.6SDK OCI driver - Solo JDK 1.1.x
8.1.6 OCI e driver SOTTILE - JDK 1.1.x e 1.2.x JDK
8.1.7 Driver OCI e THIN - JDK 1.1.x e 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
10.1.0 Driver OCI e THIN - JDK 1.2.x, JDK 1.3.xe JDK 1.4.x
10.2.0 OCI e Thin driver - JDK 1.2.x, 1.3.x JDK, JDK 1.4.x, e JDK 5.0.x
11.1.0 OCI e driver SOTTILE - JDK 1.5.x e 1.6.x JDK

Oracle 10.2. 0 supporta:

Supporto completo 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.
impossibilità del set di risultati
restituire più set di risultati.

+0

Quindi usa i driver 11g ... hai detto che li hai provati e ha funzionato, quindi qual è il problema? – skaffman

+1

Sì, il problema non esiste più. Volevo solo capire cosa stava succedendo. –

6

Ecco cosa dice l'API JDK su AbstractMethodError:

Thrown when an application tries to call an abstract method. Normally, this error is caught by the compiler; this error can only occur at run time if the definition of some class has incompatibly changed since the currently executing method was last compiled.

bug nel driver Oracle , può essere?

+0

Sì, l'errore termina la JVM quindi è molto importante sapere che cosa sta causando! Appena posso (domani) controllerò se scaricare l'ultima versione del client aiuta. L'altra cosa che mi viene in mente è che c'è qualche conflitto di DLL con un client Oracle sulla mia macchina. –

1

Suggerirei di indagare molto attentamente sul percorso di classe. Potresti avere due versioni diverse di un file jar in cui uno invoca metodi nell'altro e l'altro metodo è astratto.

60

Con JDBC, questo errore si verifica in genere perché il driver JDBC implementa una versione precedente dell'API JDBC rispetto a quella inclusa nel 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 sia apparsa. È in giro da un po ', penso.

Indipendentemente da ciò, la versione del driver JDBC (10.2.0.4.0) è piuttosto vecchia, è consigliabile aggiornarla alla versione rilasciata con 11g (in basso here) e riprovare.

3

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

4

Basta mettere ojdbc6.jar nel percorso della classe, in modo che possiamo risolvere CallbaleStatement eccezione:

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

in Oracle.

+1

risolto anche per me. –

0

Ho incontrato questo problema. uso 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. 
-2

Ho avuto lo stesso problema e risolto esso.

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

Cheers, TM

+1

Grazie, ma non sto usando commons-dbcp. –

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

al posto di questo u necessità di utilizzare

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

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

Per Maven basato applicazioni:

  1. Scaricare e copiare ojdbc6.jar in una directory nella vostra macchina locale

  2. Dalla posizione in cui è stato copiato il vostro vaso installare l'ojdbc6.jar nella vostra locale .M2 Repo immettendo sotto il comando 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 ojdbc6.vaso da dipendere

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

PS: Il problema potrebbe essere dovuto alle utilizzazioni @Lob annotazione in JPA per memorizzare grandi oggetti appartenenti a colonne oracolo db. L'aggiornamento a 11.2.0.3 (ojdbc6.jar) può risolvere il problema.

0

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

Inserire l'ultima versione del file jar ojdbc nell'applicazione o nella libreria condivisa. (Solo una versione dovrebbe essere lì e dovrebbe essere l'ultima) A partire da oggi - ojdbc6.jar

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

1

Nel mio caso questo è stato l'errore.

Exception in thread "main" 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) at org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:356) at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:2306) at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2289) at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2038) at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1532) at beans.Test.main(Test.java:24)

Soluzione: mi limito a cambiare ojdbc14.jar per ojdbc6.jar

1

Nel mio caso problema era al file di context.xml del mio progetto.

Quanto segue da context.xml causa l'errore java.lang.AbstractMethod, poiché non è stato mostrato il factory origine dati.

<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"/> 

Simpy aggiungendo fabbrica = "org.apache.tomcat.jdbc.pool.DataSourceFactory" risolto il problema:

<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"/> 

per assicurarsi che ho riprodotto il problema più volte rimuovendo fabbrica = "org.apache.tomcat.jdbc.pool.DataSourceFactory" dalla Risorsa

+0

Cambiare ojdbc7.jar in ojdbc8.jar o altre versioni non ha aiutato molto – user7244716