2009-07-28 7 views
37

Ich habe ein Problem mit JDBC.Warum bekomme ich java.lang.AbstractMethodError beim Versuch, einen Blob in der db zu laden?

I'have den folgenden Code:

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

pst.setBinaryStream(1,inputStream);   

bekomme ich folgende Fehlermeldung:

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

Meine Verbindungszeichenfolge ist jdbc:oracle:oci:@.....

Die Oracle-Version 11g.

Von der Fehlermeldung scheint es, dass etwas fehlt, aber:

  • , wenn ich aus dem gleichen Blobs Spalte (mit blob.getBytes) alles lesen funktioniert. Die DLLs des Instant Clients sind (korrekt) im Bibliothekspfad.
  • Dies ist das Manifest der Oracle JDBC JAR in meiner Klasse Pfad:

    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

Ich denke, dass Sie das vor langer Zeit gelöst haben, aber für diejenigen, die jetzt hierher kommen. Die Lösung kann hier gefunden werden: http://stackoverflow.com/a/27847317/511976 – mhvelplund

Antwort

10

Es sieht aus, dass selbst wenn der Fahrer 10.2 mit dem JDBC3 kompatibel ist es nicht mit JRE6 arbeiten kann, wie ich hier gefunden habe:

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

Welche JDBC-Treiber unterstützen die Versionen von Javasoft JDK ?

pre-8i OCI und THIN Treiber - JDK 1.0.x und 1.1.x JDK
8.1.5 OCI und THIN Treiber - JDK 1.0.x und 1.1.x JDK
8.1.6SDK THIN Driver - JDK 1.1 .x und JDK 1.2.x (aka Java2)
8.1.6SDK OCI Driver - Nur JDK 1.1.x
8.1.6 OCI und THIN Driver - JDK 1.1.x und 1.2.x JDK
8.1.7 OCI- und THIN-Treiber - JDK 1.1.x und JDK 1.2.x 9.0.1 OCI- und THIN-Treiber - JDK 1.1.x, JDK 1.2.x und JDK 1.3.x
9.2.0 OCI und THIN Treiber - JDK 1.1.x, JDK 1.2.x, JDK 1.3.x und JDK 1.4.x
10.1.0 OCI- und THIN-Treiber - JDK 1.2.x, JDK 1.3.x und JDK 1.4.x
10.2.0 OCI und THIN Driver - JDK 1.2.x, 1.3.x JDK, JDK 1.4.x und 5.0.x JDK
11.1.0 OCI und THIN Driver - JDK 1.5.x und 1.6.x JDK

Oracle 10.2. 0 unterstützt:

Volle Unterstützung für JDBC 3.0
Beachten Sie, dass sich die Unterstützung für Folgendes in der Datenbank nicht wirklich ändert. Alles, was sich geändert hat, ist, dass einige Methoden, die zuvor SQLException ausgelöst haben, nun etwas Sinnvolleres tun.
Ergebnis-Set-Holdability
Rückgabe mehrerer Ergebnis-Sets.

+0

Also benutze die 11g Treiber ... du hast gesagt du hast sie ausprobiert und es hat funktioniert, also was ist das Problem? – skaffman

+1

Ja, das Problem existiert nicht mehr. Ich wollte nur herausfinden, was passiert ist. –

6

Hier ist, was die JDK API sagt über 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 in der Oracle-Treiber , könnte sein?

+0

Ja, der Fehler beendet die JVM, so dass es sehr wichtig ist zu wissen, was es verursacht! Sobald ich (morgen) kann ich überprüfen, ob das Herunterladen der neuesten Version des Clients hilft. Die andere Sache, die mir in den Sinn kommt, ist, dass es einen DLL-Konflikt mit einem Oracle-Client auf meiner Maschine gibt. –

1

Ich würde vorschlagen, Ihre Klassenpfad sehr sorgfältig zu untersuchen. Sie haben möglicherweise zwei verschiedene Versionen einer JAR-Datei, wobei die eine Methode Methoden in der anderen verwendet und die andere Methode abstrakt ist.

60

Mit JDBC tritt dieser Fehler normalerweise auf, weil Ihr JDBC-Treiber eine ältere Version der JDBC-API als die in Ihrer JRE enthaltene implementiert. Diese älteren Versionen sind in Ordnung, solange Sie nicht versuchen, eine Methode zu verwenden, die in der neueren API angezeigt wurde.

Ich bin nicht sicher, welche Version von JDBC setBinaryStream erschien. Es ist schon eine Weile her, denke ich.

Egal, Ihre JDBC-Treiberversion (10.2.0.4.0) ist ziemlich alt, ich empfehle, sie auf die Version, die mit 11g veröffentlicht wurde (here), zu aktualisieren, und versuchen Sie es erneut.

3

Wie in der API von java.sql.PreparedStatement.setBinaryStream() beschrieben, ist es seit 1.6 verfügbar, also ist es eine JDBC 4.0 API! Sie verwenden einen JDBC 3 Treiber, so dass diese Methode nicht verfügbar ist!

4

Einfach ojdbc6.jar in Klassenpfad, so dass wir CallbaleStatement Ausnahme beheben:

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

in Oracle.

+1

Auch für mich behoben. –

0

Ich triff dieses Problem. Verwendung ojdbc14.jar und 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

ich das gleiche Problem bekam und es gelöst.

Um dieses Problem zu beheben, sollten Sie commons-dbcp Bibliothek auf die neueste Version (1.4) aktualisieren. Es wird mit den neuesten JDBC-Treibern funktionieren.

Cheers, TM

+1

Danke, aber ich benutze nicht commons-dbcp. –

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

statt dessen u

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

Verwenden Sie einfach ojdb6.jar und werden alle diese Probleme beheben verwenden müssen.

Für Maven-basierten Anwendungen:

  1. herunterladen und kopieren ojdbc6.jar in ein Verzeichnis in Ihrem lokalen Rechner

  2. Von dem Ort, wo Sie Ihr Glas der ojdbc6.jar installieren kopiert haben in Ihrem local .M2 Repo durch Ausgabe unter Befehl C: \ SRK \ Software \ Bibliotheken> mvn install: installationsdatei -DgroupId = com.oracle -DartifactId = ojdbc6 -Dversion = 11.2.0.3 -Dpackaging = jar -Dfile = ojdbc6. jar -DgeneratePom = true

  3. Fügen Sie die unten in Ihrem Projekt pom.xml als ojdbc6.jar Abhängigkeit

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

PS: Das Problem aufgrund Verwendungen von @Lob Annotation in JPA könnte große Objekte speziell in oracle db Spalten zum Speichern. Das Upgrade auf 11.2.0.3 (ojdbc6.jar) kann das Problem beheben.

0

Das Problem liegt an der älteren Version von ojdbc - ojdbc14.

Legen Sie die neueste Version der OJDBC-JAR-Datei in Ihre Anwendung oder gemeinsam genutzte Bibliothek. (nur eine Version sollte es sein und es sollte die letzte sein) Ab heute - ojdbc6.jar

Überprüfen Sie die Anwendungsbibliotheken und gemeinsam genutzte Bibliotheken auf dem Server.

1

In meinem Fall bekommen dies der Fehler war.

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)

Lösung: Ich wechsle nur ojdbc14.jar zu ojdbc6.jar

1

In meinem Fall Problem bei context.xml Datei meines Projekts war.

Das folgende von context.xml verursacht das java.lang.AbstractMethodError, da wir die Datenquellenfactory nicht zeigten.

<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 Hinzufügen Fabrik = "org.apache.tomcat.jdbc.pool.DataSourceFactory" das Problem gelöst:

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

Um sicherzustellen, dass ich das Problem mehrmals durch Entfernen Fabrik reproduziert = "org.apache.tomcat.jdbc.pool.DataSourceFactory" von der Ressource

+0

Das Ändern von ojdbc7.jar zu ojdbc8.jar oder anderen Versionen hat nicht viel geholfen – user7244716

Verwandte Themen