Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在db中加载blob时会出现java.lang.AbstractMethodError?_Java_Database_Oracle_Jdbc_Oracleclient - Fatal编程技术网

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

为什么在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

我对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是 (正确)在库路径中
  • 这是神谕的清单 我的类路径中的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的应用程序:

    • 下载ojdbc6.jar并将其复制到本地计算机中的目录中

    • 从复制jar的位置,通过发出以下命令,在本地.M2 Repo中安装ojdbc6.jar C:\SRK\Softwares\Libraries>mvn安装:安装文件-DgroupId=com.oracle-DartifactId=ojdbc6-Dversion=11.2.0.3 -dpackage=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>
      
      
      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"/>