为什么当我试图在db中加载一个blob的时候会得到java.lang.AbstractMethodError呢?

我有一个JDBC的问题。

我有以下代码:

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

我得到以下错误:

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

我的连接string是jdbc:oracle:oci:@.....

Oracle版本是11g。

从错误消息,似乎有什么东西是失踪,但:

  • 当我从同一个BLOB列(使用blob.getBytes)读取一切正常。
  • 即时客户端的DLL(正确)在库path中。
  • 这是我的类path中的Oracle JDBC JAR的清单:

     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 

使用JDBC时,通常会发生该错误,因为您的JDBC驱动程序实现的JDBC API的版本比您的JRE中包含的版本旧。 只要您不尝试使用更新的API中出现的方法,这些旧版本就没有问题。

我不确定什么版本的JDBC setBinaryStream出现在这里。我想,这已经有一段时间了。

无论如何,你的JDBC驱动程序版本(10.2.0.4.0)是相当古老的,我build议将它升级到11g版本(在这里下载 ),然后再试一次。

它看起来即使驱动程序10.2与JDBC3兼容,它可能无法使用JRE6,因为我已经在这里find了:

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

哪些JDBC驱动程序支持Javasoft JDK的哪个版本?

pre-8i OCI和THIN驱动程序 – JDK 1.0.x和JDK 1.1.x
8.1.5 OCI和THIN驱动程序 – JDK 1.0.x和JDK 1.1.x
8.1.6SDK THIN驱动程序 – JDK 1.1.x和JDK 1.2.x(又名Java2)
8.1.6SDK OCI驱动程序 – 仅JDK 1.1.x
8.1.6 OCI和THIN驱动程序 – JDK 1.1.x和JDK 1.2.x
8.1.7 OCI和THIN驱动程序 – JDK 1.1.x和JDK 1.2.x
9.0.1 OCI和THIN驱动程序 – JDK 1.1.x,JDK 1.2.x和JDK 1.3.x
9.2.0 OCI和THIN驱动程序 – JDK 1.1.x,JDK 1.2.x,JDK 1.3.x和JDK 1.4.x
10.1.0 OCI和THIN驱动程序 – JDK 1.2.x,JDK 1.3.x和JDK 1.4.x
10.2.0 OCI和THIN驱动程序 – JDK 1.2.x,JDK 1.3.x,JDK 1.4.x和JDK 5.0.x
11.1.0 OCI和THIN驱动程序 – JDK 1.5.x和JDK 1.6.x

Oracle 10.2.0支持:

完全支持JDBC 3.0
请注意,数据库中对以下内容的支持没有真正的变化。 所有改变的是,之前抛出SQLException的一些方法现在做的更合理。
结果集可保存性
返回多个结果集。

以下是JDK API关于AbstractMethodError的说明:

在应用程序尝试调用抽象方法时抛出。 通常,这个错误被编译器捕获; 这个错误只能在运行时发生,如果某个类的定义由于当前正在执行的方法被上一次编译而发生了不兼容的变化。

在oracle驱动程序的错误,也许?

只要将ojdbc6.jar放在类path中,以便我们可以修复CallbaleStatementexception:

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

在Oracle中。

正如在java.sql.PreparedStatement.setBinaryStream()的API中所描述的那样,它在1.6以后是可用的,所以它是一个JDBC 4.0 API ! 您使用JDBC 3驱动程序,所以此方法不可用!

我会build议仔细研究你的classpath。 你可能有两个不同版本的jar文件,其中一个调用另一个方法,另一个方法是抽象的。

只要使用ojdb6.jar并将修复所有这些问题。

对于基于Maven的应用程序:

  1. 下载并将ojdbc6.jar复制到本地计算机上的目录

  2. 从复制jar的位置,通过下面的命令在本地的.M2 Repo上安装ojdbc6.jar: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. 将下面的项目添加到您的项目pom.xml中作为ojdbc6.jar依赖项

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

PS:这个问题可能是由于在JPA中使用@Lob批注来专门在Oracle数据库列中存储大对象。 升级到11.2.0.3(ojdbc6.jar)可以解决问题。

我确实遇到了这个问题。 使用ojdbc14.jar和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()); 

而不是你需要使用

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

问题是由于旧版本的ojdbc – ojdbc14。

将最新版本的ojdbc jar文件放在您的应用程序或共享库中。 (只有一个版本应该在那里,它应该是最新的一个)截至今天 – ojdbc6.jar

检查服务器上的应用程序库和共享库。

我想,从jdbc驱动程序错误的原因,你应该得到适合你的Oracle分贝的适当的JDBC驱动程序。你可以在这里

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

在我的情况下,这是错误的。

线程“main”中的exceptionjava.lang.AbstractMethodError:oracle.jdbc.driver.T4CConnection.isValid(I)Z 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 .apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2038)org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2289)上的.validateConnectionFactory(BasicDataSource.java:2306) )在org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1532)在beans.Test.main(Test.java:24)

解决scheme:我只是将ojdbc14.jar更改为ojdbc6.jar

我得到了同样的问题,并解决了它。

要解决此问题,您应该将commons-dbcp库升级到最新版本(1.4)。 它将使用最新的JDBC驱动程序。

干杯,TM