尝试在db中加载blob时,为什么会出现java.lang.AbstractMethodError?

时间:2009-07-28 15:43:43

标签: java database oracle jdbc oracleclient

我遇到了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  

我的连接字符串是jdbc:oracle:oci:@.....

Oracle版本为11g。

从错误消息中可以看出缺少某些内容但是:

  • 当我从相同的blob列中读取时 (用blob.getBytes)一切 作品。
  • 即时客户端的DLL是 (正确地)在库路径中。
  • 这是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  
    

14 个答案:

答案 0 :(得分:64)

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

我不确定出现了什么版本的JDBC setBinaryStream。我认为它已存在一段时间了。

无论如何,您的JDBC驱动程序版本(10.2.0.4.0)已经很老了,我建议将其升级到11g发布的版本(下载here),然后重试。

答案 1 :(得分:11)

看起来即使驱动程序10.2与JDBC3兼容,它也可能无法与JRE6一起使用 正如我在这里找到的那​​样:

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的一些方法现在做了更合理的事情 结果集可保持性
返回多个结果集。

答案 2 :(得分:6)

以下是JDK API关于AbstractMethodError的内容:

  

应用程序尝试时抛出   调用抽象方法。一般,   编译器捕获此错误;   此错误只能在运行时发生   如果某个类的定义有   自从以后不一致改变了   目前正在执行的方法是最后   编译。

oracle驱动程序中的bug,也许?

答案 3 :(得分:4)

只需将ojdbc6.jar放在类路径中,以便我们可以修复CallbaleStatement异常:

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

答案 4 :(得分:3)

java.sql.PreparedStatement.setBinaryStream()的API中所述,它从1.6开始可用,因此它是 JDBC 4.0 API !您使用 JDBC 3驱动程序,因此此方法不可用!

答案 5 :(得分:2)

只需使用ojdb6.jar即可修复所有此类问题。

对于基于maven的应用程序:

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

  2. 从您复制jar的位置,通过发出以下命令在本地.M2回购中安装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>
    
  4. PS:问题可能是由于在JPA中使用@Lob注释来专门存储oracle db列中的大对象。升级到11.2.0.3(ojdbc6.jar)可以解决问题。

答案 6 :(得分:2)

就我而言,这是错误。

  

线程中的异常&#34; main&#34; 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)       在beans.Test.main(Test.java:24)

解决方案:我只需将my_input = input('Input: ') 更改为ojdbc14.jar

答案 7 :(得分:1)

我建议你仔细调查你的类路径。您可能有两个不同版本的jar文件,其中一个调用另一个的方法,另一个方法是抽象的。

答案 8 :(得分:1)

在我的情况下,问题出在我项目的context.xml文件中。

context.xml中的以下内容会导致 java.lang.AbstractMethodError ,因为我们没有显示数据源工厂。

<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添加 factory =&#34; org.apache.tomcat.jdbc.pool.DataSourceFactory&#34; 解决了这个问题:

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

通过删除factory =&#34; org.apache.tomcat.jdbc.pool.DataSourceFactory&#34;确保我多次重现此问题。来自资源

答案 9 :(得分:0)

我确实遇到了这个问题。 使用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.

答案 10 :(得分:0)

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

而不是你需要使用

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

答案 11 :(得分:0)

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

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

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

答案 12 :(得分:0)

我认为,JDBC驱动程序出错的原因是,您应该为Oracle数据库获取合适的JDBC驱动程序。你可以从

获得它

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

答案 13 :(得分:-2)

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

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