Почему я получаю java.ленг.AbstractMethodError при попытке загрузить blob в БД?

у меня проблема с 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 (с каплей.метод 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  
    

14 ответов


С JDBC эта ошибка обычно возникает, потому что драйвер JDBC реализует более старую версию API JDBC, чем версия, включенная в JRE. Эти старые версии в порядке, если вы не пытаетесь использовать метод, который появился в новом API.

Я не уверен, какая версия JDBC в. По-моему, это было давно.

независимо от того, ваша версия драйвера JDBC (10.2.0.4.0) довольно старая, я рекомендую обновить ее до версии, которая была выпущено с 11g (скачать здесь), и попробуйте снова.


похоже, что даже если драйвер 10.2 совместим с JDBC3, он может не работать с JRE6 как я нашел здесь:

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

какие драйверы JDBC поддерживают какие версии JDK Javasoft?

pre-8i OCI и тонкие драйверы-JDK 1.0.x и JDK 1.1.x
8.1.5 OCI и тонкие драйверы-JDK 1.0.x и JDK 1.1.x
8.1.6 тонкий драйвер SDK - С JDK 1.1.x и JDK 1.2.x (он же Java2)
8.1.6 драйвер OCI SDK-только 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 и тонкий драйвер-JDK 1.1.x, JDK 1.2.x и JDK 1.3.x
9.2.0 OCI и тонкий драйвер-JDK 1.1.x, JDK 1.2.x, JDK 1.3.x и JDK 1.4.x
10.1.0 OCI и тонкий драйвер-JDK 1.2.x, JDK 1.3.x и JDK 1.4.x
10.2.0 OCI и тонкий драйвер-JDK 1.2.x, JDK 1.3.х, версии JDK 1.4.x и JDK 5.0.x
11.1.0 OCI и тонкий драйвер-JDK 1.5.x и JDK 1.6.x

в Oracle 10.2.0 поддерживает:

полная поддержка JDBC 3.0
Обратите внимание, что в базе данных нет реальных изменений в поддержке следующего. Все, что изменилось, - это то, что некоторые методы, которые ранее бросали SQLException, теперь делают что-то более разумное.
Result-set holdability
возвращение нескольких результирующих наборов.


вот что говорит API JDK об AbstractMethodError:

брошенный, когда приложение пытается вызвать абстрактный метод. Обычно, эта ошибка перехватывается компилятором; эта ошибка может возникнуть только во время выполнения если определение некоторого класса имеет несовместимо изменился с текущий метод выполнения был последним составленный.

ошибка в драйвере oracle, может быть?


просто поставить ojdbc6.jar в пути к классу, чтобы мы могли исправить CallbaleStatement исключения:

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

в Oracle.


как описано в API java.sql.PreparedStatement.setBinaryStream() Он доступен с 1.6, так что это JDBC 4.0 API! Вы используете драйвер JDBC 3 таким образом, этот метод недоступен!


в моем случае это была ошибка.

исключение в потоке" main " java.ленг.AbstractMethodError: oracle.интерфейс jdbc.водитель.T4CConnection.isValid (I)Z в орг.апаш.кот.dbcp.dbcp2.DelegatingConnection.функция IsValid(DelegatingConnection.java: 917) в орг.апаш.кот.dbcp.dbcp2.PoolableConnection.проверка (PoolableConnection.java: 282) в орг.апаш.кот.dbcp.dbcp2.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java: 356) на орг.апаш.кот.dbcp.dbcp2.BasicDataSource.validateConnectionFactory (BasicDataSource.java: 2306) в орг.апаш.кот.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory (BasicDataSource.java: 2289) в орг.апаш.кот.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java: 2038) в орг.апаш.кот.dbcp.dbcp2.BasicDataSource.getConnection (BasicDataSource.java: 1532) в бинз.Тест.main (Test.java: 24)

устранение: I просто изменить ojdbc14.jar до ojdbc6.jar


просто используйте ojdb6.jar и исправит все такие проблемы.

для приложений на основе maven:

  1. загрузить и скопировать ojdbc6.jar в каталог на вашем локальном компьютере

  2. из места, где вы скопировали jar, установите ojdbc6.банку в вашем местном .M2 Repo, выдав команду ниже C:\SRK\Softwares\Libraries > mvn install:install-file-DgroupId=com.oracle-DartifactId=ojdbc6-Dversion=11.2.0.3 - Dpackaging=jar Единственный способ иметь установленный=ojdbc6.jar-DgeneratePom=true

  3. добавьте ниже в свой проект pom.xml как ojdbc6.jar dependency

    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.3</version>
    </dependency>
    

PS: проблема может быть связана с использованием аннотации @Lob в JPA для хранения больших объектов, особенно в Столбцах Oracle db. Обновление до 11.2.0.3 (ojdbc6.jar) может решить проблему.


Я бы предложил очень тщательно исследовать ваш путь к классам. У вас могут быть две разные версии файла jar, где один вызывает методы в другом, а другой метод является абстрактным.


в моем случае проблема была в контексте.XML-файл моего проекта.

следующее из контекста.XML-код причины java.ленг.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= " org.апаш.кот.интерфейс jdbc.бассейн.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.апаш.кот.интерфейс jdbc.бассейн.DataSourceFactory" из ресурса


я встречаю эту проблему. использовать 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.

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

вместо этого u нужно использовать

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

проблема связана с более старой версией ojdbc-ojdbc14.

поместите последнюю версию файла ojdbc jar в приложение или общую библиотеку. (Должна быть только одна версия и она должна быть последней) На сегодняшний день-ojdbc6.Джар

Проверьте библиотеки приложений и общие библиотеки на сервере.


Я думаю, причина ошибки из драйвера JDBC, вы должны получить подходящий драйвер JDBC для вашей Oracle db. Вы можете получить его от

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


Я получил ту же проблему и решил ее.

чтобы решить эту проблему, вам необходимо обновить commons-dbcp библиотеку до последней версии (1.4). Он будет работать с последними драйверами JDBC.