【问题标题】:Why do I get java.lang.AbstractMethodError when trying to load a blob in the db?尝试在数据库中加载 blob 时,为什么会出现 java.lang.AbstractMethodError?
【发布时间】:2023-03-21 08:24:01
【问题描述】:

我的 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  
    

【问题讨论】:

标签: java oracle jdbc


【解决方案1】:

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

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

【讨论】:

  • 谢谢,但我没有使用 commons-dbcp。
【解决方案2】:

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

我不确定 JDBC setBinaryStream 出现在哪个版本中。我想它已经存在了一段时间。

不管怎样,你的 JDBC 驱动版本(10.2.0.4.0)太旧了,我建议升级到 11g 发布的版本(下载here),然后再试一次。

【讨论】:

    【解决方案3】:

    只需使用 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>
      

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

    【讨论】:

      【解决方案4】:

      我认为,JDBC驱动错误的原因,你应该为你的Oracle数据库找到合适的JDBC驱动。你可以从

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

      【讨论】:

        【解决方案5】:

        在我的情况下,问题出在我项目的 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"/> 
        

        简单添加 factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 解决了这个问题:

        <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="org.apache.tomcat.jdbc.pool.DataSourceFactory" 多次重现该问题

        【讨论】:

        • 将 ojdbc7.jar 更改为 ojdbc8.jar 或其他版本并没有多大帮助
        【解决方案6】:

        就我而言,这是错误。

        线程“主”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

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

            【解决方案8】:
            InputStream in = new FileInputStream(file);     
            cstmt.setBinaryStream(1, in,file.length());  
            

            你需要使用这个来代替

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

            【讨论】:

              【解决方案9】:

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

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

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

                在甲骨文中。

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                    【解决方案12】:

                    看起来即使驱动 10.2 兼容 JDBC3 也可能不适用于 JRE6 正如我在这里找到的:

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

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

                    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 的一些方法现在改为执行更合理的操作。
                    结果集可保存性
                    返回多个结果集。

                    【讨论】:

                    • 所以使用 11g 驱动程序...您说您尝试过它们并且有效,那么问题是什么?
                    • 是的,问题不存在了。我只是想弄清楚发生了什么。
                    【解决方案13】:

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

                    【讨论】:

                      【解决方案14】:

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

                      当应用程序尝试 调用抽象方法。一般, 这个错误被编译器捕获; 此错误只能在运行时发生 如果某个类的定义有 不兼容地改变,因为 当前执行的方法是最后一个 编译。

                      可能是 Oracle 驱动程序中的错误?

                      【讨论】:

                      • 是的,错误会终止 JVM,因此了解导致错误的原因非常重要!我会尽快(明天)检查下载最新版本的客户端是否有帮助。我想到的另一件事是与我机器上的 oracle 客户端存在一些 dll 冲突。
                      猜你喜欢
                      • 2014-08-31
                      • 1970-01-01
                      • 2017-06-20
                      • 2017-11-25
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多