Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do I get java.lang.AbstractMethodError when trying to load a blob in the db?

Tags:

java

oracle

jdbc

I've got a problem with JDBC.

I'have the following code:

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

I get the following error:

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

My connection string is jdbc:oracle:oci:@.....

The Oracle version is 11g.

From the error message it seems that something is missing but:

  • when I read from the same blob column (with blob.getBytes) everything works.
  • The DLL's of the instant client are (correctly) in the library path.
  • This is the manifest of the Oracle JDBC JAR in my class path:

    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   
like image 643
mic.sca Avatar asked Jul 28 '09 15:07

mic.sca


2 Answers

With JDBC, that error usually occurs because your JDBC driver implements an older version of the JDBC API than the one included in your JRE. These older versions are fine so long as you don't try and use a method that appeared in the newer API.

I'm not sure what version of JDBC setBinaryStream appeared in. It's been around for a while, I think.

Regardless, your JDBC driver version (10.2.0.4.0) is quite old, I recommend upgrading it to the version that was released with 11g (download here), and try again.

like image 78
skaffman Avatar answered Oct 07 '22 12:10

skaffman


It looks that even if the driver 10.2 is compatible with the JDBC3 it may not work with JRE6 as I've found here:

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

Which JDBC drivers support which versions of Javasoft's JDK?

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

Oracle 10.2.0 supports:

Full support for JDBC 3.0
Note that there is no real change in the support for the following in the database. Allthat has changed is that some methods that previously threw SQLException now do something more reasonable instead.
result-set holdability
returning multiple result-sets.

like image 44
mic.sca Avatar answered Oct 07 '22 11:10

mic.sca