Почему я получаю 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:
загрузить и скопировать ojdbc6.jar в каталог на вашем локальном компьютере
из места, где вы скопировали 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
-
добавьте ниже в свой проект 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.