我遇到了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。
从错误消息中可以看出缺少某些内容但是:
这是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
答案 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的应用程序:
将ojdbc6.jar下载并复制到本地计算机上的目录
从您复制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
在项目pom.xml中添加以下内容作为ojdbc6.jar依赖
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
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驱动程序一起使用。