Почему я получаю 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
Ответы
Ответ 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:
-
Загрузите и скопируйте файл ojdbc6.jar в каталог на вашем локальном компьютере
-
Из места, где вы скопировали свою банку, установите 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
-
Добавьте ниже в проект 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
Проверьте библиотеки приложений и разделяемые библиотеки на сервере.
Ответ 13
Я думаю, причина ошибки драйвера JDBC, вы должны получить подходящий драйвер JDBC для вашего Oracle db. Вы можете получить его от
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
Ответ 14
У меня такая же проблема, и я ее разрешил.
Чтобы решить эту проблему, вы должны обновить библиотеку commons-dbcp до последней версии (1.4). Он будет работать с последними драйверами JDBC.