为什么在db中加载blob时会出现java.lang.AbstractMethodError?
我对JDBC有一个问题 我有以下代码:为什么在db中加载blob时会出现java.lang.AbstractMethodError?,java,database,oracle,jdbc,oracleclient,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
//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是 (正确)在库路径中
- 这是神谕的清单
我的类路径中的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
- 以下是JDK API对AbstractMethodError的描述:
当应用程序试图
调用抽象方法。正常地
此错误被编译器捕获;
此错误只能在运行时发生
如果某个类的定义
自
当前执行的方法是最后一个
编译
oracle驱动程序中可能存在Bug?我建议您仔细研究类路径。您可能有两个不同版本的jar文件,其中一个调用另一个中的方法,另一个方法是抽象的。对于JDBC,通常会发生此错误,因为您的JDBC驱动程序实现的JDBC API版本比JRE中包含的版本旧。只要您不尝试使用新API中出现的方法,这些旧版本就可以了 我不确定JDBC
setBinaryStream
的版本是什么。我想这已经有一段时间了
无论如何,您的JDBC驱动程序版本(10.2.0.4.0)非常旧,我建议将其升级到11g(下载)发布的版本,然后重试。看起来,即使驱动程序10.2与JDBC3兼容,也可能无法与JRE6一起使用 正如我在这里发现的: 哪些JDBC驱动程序支持哪些版本的Javasoft JDK 8i之前的OCI和精简驱动程序-JDK 1.0.x和JDK 1.1.x
8.1.5 OCI和精简驱动程序-JDK 1.0.x和JDK 1.1.x
8.1.6SDK精简驱动程序-JDK1.1.x和JDK1.2.x(又名Java2)
8.1.6SDK OCI驱动程序-仅限JDK 1.1.x
8.1.6 OCI和精简驱动程序-JDK 1.1.x和JDK 1.2.x
8.1.7 OCI和精简驱动程序-JDK 1.1.x和JDK 1.2.x
9.0.1 OCI和精简驱动程序-JDK1.1.x、JDK1.2.x和JDK1.3.x
9.2.0 OCI和精简驱动程序-JDK1.1.x、JDK1.2.x、JDK1.3.x和JDK1.4.x
10.1.0 OCI和精简驱动程序-JDK1.2.x、JDK1.3.x和JDK1.4.x
10.2.0 OCI和精简驱动程序-JDK1.2.x、JDK1.3.x、JDK1.4.x和JDK5.0.x
11.1.0 OCI和精简驱动程序-JDK 1.5.x和JDK 1.6.x Oracle 10.2.0支持: 完全支持JDBC 3.0
请注意,数据库中对以下内容的支持没有实际变化。所发生的变化是,以前抛出SQLException的一些方法现在做了一些更合理的事情。
结果集保持性
返回多个结果集 如
java.sql.PreparedStatement.setBinaryStream()
的API所述,它从1.6版开始提供,因此它是一个JDBC 4.0 API!您使用的是JDBC 3驱动程序,因此此方法不可用 只需将ojdbc6.jar
放在类路径中,就可以修复CallbaleStatement
异常:
oracle.jdbc.driver.T4CPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V)
在Oracle中。我确实遇到了这个问题。
使用ojdbc14.jar和JDK1.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.
我遇到了同样的问题并解决了它 要解决此问题,应将commons dbcp库升级到最新版本(1.4)。它将与最新的JDBC驱动程序一起工作
InputStream in = new FileInputStream(file);
cstmt.setBinaryStream(1, in,file.length());
你需要使用的不是这个
InputStream in = new FileInputStream(file);
cstmt.setBinaryStream(1, in,(int)file.length());
只需使用ojdb6.jar,即可解决所有此类问题 对于基于maven的应用程序:
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
com.oracle
ojdbc6
11.2.0.3
PS:问题可能是由于在JPA中使用@Lob注释来存储oracle db列中的大型对象。升级到11.2.0.3(ojdbc6.jar)可以解决此问题。此问题是由于较旧版本的ojdbc-ojdbc14造成的 将最新版本的ojdbc jar文件放在应用程序或共享库中。 (应仅提供一个版本,且应为最新版本) 从今天起-ojdbc6.jar
检查服务器上的应用程序库和共享库。我认为,由于JDBC驱动程序出错,您应该为您的Oracle数据库获取合适的JDBC驱动程序。你可以从
就我而言,这就是错误所在 线程“main”java.lang.AbstractMethodError中出现异常:oracle.jdbc.driver.T4CConnection.isValid(I)Z 位于org.apache.tomcat.dbcp.dbcp2.DelegatingConnection.isValid(DelegatingConnection.java:917) 位于org.apache.tomcat.dbcp.dbcp2.PoolableConnection.validate(PoolableConnection.java:282) 位于org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:356) 位于org.apache.tomcat.dbcp.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:2306) 位于org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2289) 位于org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2038) 位于org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1532) 位于beans.Test.main(Test.java:24)
解决方案:我只是将
ojdbc14.jar
更改为ojdbc6.jar
在我的案例中,问题出现在我项目的context.xml文件中
下面来自context.xml的内容导致了java。
<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"/>
<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"/>