Подтвердить что ты не робот

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

У меня проблема с 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 текущего клиента (правильно) в пути к библиотеке.
  • Это манифест 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  
    
4b9b3361

Ответ 1

Похоже, что даже если драйвер 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 Drivers - 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 Driver - JDK 1.1.x и JDK 1.2.x(aka Java2)
8.1.6SDK Драйвер OCI - только JDK 1.1.x
8.1.6 OCI и THIN Driver - JDK 1.1.x и JDK 1.2.x
8.1.7 OCI и THIN Driver - JDK 1.1.x и JDK 1.2.x
9.0.1 OCI и THIN Driver - JDK 1.1.x, JDK 1.2.x и JDK 1.3.x
9.2.0 OCI и THIN Driver - JDK 1.1.x, JDK 1.2.x, JDK 1.3.x и JDK 1.4.x
10.1.0 OCI и THIN Driver - JDK 1.2.x, JDK 1.3.x и JDK 1.4.x
10.2.0 OCI и THIN Driver - JDK 1.2.x, JDK 1.3.x, JDK 1.4.x и JDK 5.0.x
11.1.0 OCI и THIN Driver - JDK 1.5.x и JDK 1.6.x

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

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

Ответ 2

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

Я не уверен, какая версия JDBC setBinaryStream появилась. Похоже, это было какое-то время.

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

Ответ 3

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

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

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

Ответ 4

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

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

в Oracle.

Ответ 5

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

Ответ 6

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

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

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

  2. Из места, где вы скопировали свою банку, установите ojdbc6.jar в локальном реестре.M2, выпустив ниже команду 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: Проблема может быть связана с использованием аннотации @Lob в JPA для хранения больших объектов в столбцах oracle db. Модернизация до 11.2.0.3 (ojdbc6.jar) может решить проблему.

Ответ 7

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

Исключение в потоке "main" java.lang.AbstractMethodError: oracle.jdbc.driver.T4CConnection.isValid(I) Z     на 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)     на org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2289)     на 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)

Решение: Я просто меняю ojdbc14.jar на ojdbc6.jar

Ответ 8

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

Ответ 9

В моем случае проблема была в файле 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 = "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" из ресурса

Ответ 10

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

Ответ 11

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

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

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

Ответ 12

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

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

Проверьте библиотеки приложений и разделяемые библиотеки на сервере.

Ответ 14

У меня такая же проблема, и я ее разрешил.

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