web-dev-qa-db-ja.com

dbにblobをロードしようとすると、Java.lang.AbstractMethodErrorが発生するのはなぜですか?

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  
    
45
mic.sca

ドライバー10.2がJDBC3と互換性がある場合でも、ここで見つけたように、JRE6では動作しない可能性があります。

http://www.Oracle.com/technology/tech/Java/sqlj_jdbc/htdocs/jdbc_faq.html#02_

どのJDBCドライバーがJavasoftのJDKのどのバージョンをサポートしていますか?

pre-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をスローしていた一部のメソッドが、より合理的なことを行うようになったことです。
結果セットの保持性
複数の結果セットを返します。

11
mic.sca

JDBCでは、JDBCドライバーがJREに含まれているものよりも古いバージョンのJDBC APIを実装しているため、通常このエラーが発生します。これらの古いバージョンは、新しいAPIに登場したメソッドを試して使用しない限り問題ありません。

どのバージョンのJDBC setBinaryStreamが登場したのかわかりません。しばらくの間は存在していると思います。

にもかかわらず、JDBCドライバーのバージョン(10.2.0.4.0)はかなり古いため、11gでリリースされたバージョンにアップグレードすることをお勧めします(ダウンロード ここ )。

64
skaffman

以下は、JDK APIがAbstractMethodErrorについて言っていることです。

アプリケーションが抽象メソッドを呼び出そうとするとスローされます。通常、このエラーはコンパイラーによってキャッチされます。このエラーは、現在実行中のメソッドが最後にコンパイルされてから、あるクラスの定義が非互換に変更された場合にのみ実行時に発生します。

Oracleドライバーのバグでしょうか?

6
Steve B.

ojdbc6.jarをクラスパスに配置するだけで、CallbaleStatement例外を修正できます。

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

oracleで。

4
Sudarsan

Java.sql.PreparedStatement.setBinaryStream()のAPIで説明されているように、1.6以降で利用できるため、JDBC 4.0 APIJDBC 3 Driverを使用するため、このメソッドは使用できません!

3
Arne Burmeister

私の場合、これはエラーでした。

スレッド「メイン」の例外Java.lang.AbstractMethodError:org.ApacheのOracle.jdbc.driver.T4CConnection.isValid(I)Z org.Apache.Tomcat.dbcp.dbcp2.DelegatingConnection.isValid(DelegatingConnection.Java:917)at org.Apache org.Apache.Tomcat.dbcp.dbcp2.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.Java:356)at org.Apache.Tomcat.dbcp.dbcp2.BasicDataSourceの.Tomcat.dbcp.dbcp2.PoolableConnection.validate(PoolableConnection.Java:282) org.Apache.Tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.Java:2289)at org.Apache.Tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.Java:2038)の.validateConnectionFactory(BasicDataSource.Java:2306) )org.Apache.Tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.Java:1532)at beans.Test.main(Test.Java:24)

解決策:変更するだけでojdbc14.jarからojdbc6.jar

2
MayurChovatiya

Ojdb6.jarを使用するだけで、このような問題はすべて修正されます。

Mavenベースのアプリケーションの場合:

  1. Ojdbc6.jarをダウンロードして、ローカルマシンのディレクトリにコピーします。

  2. Jarをコピーした場所から、以下のコマンドC:\ SRK\Softwares\Libraries> mvn install:install-file -DgroupId = com.Oracle -DartifactId = ojdbc6を発行して、ローカルの.M2リポジトリにojdbc6.jarをインストールします- 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:この問題は、特にOracle db列にラージオブジェクトを格納するためにJPAで@Lobアノテーションを使用していることが原因である可能性があります。 11.2.0.3(ojdbc6.jar)にアップグレードすると、問題を解決できます。

2
Shoaib Khan

クラスパスを慎重に調査することをお勧めします。 jarファイルの2つの異なるバージョンがあり、一方が他方のメソッドを呼び出し、もう一方が抽象メソッドである場合があります。

私の場合、問題はプロジェクトの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"を削除して、問題を何度か再現したことを確認します。

1
valijon

JDBCドライバーからのエラーの原因は、Oracleデータベースに適したJDBCドライバーを取得する必要があると思います。から入手できます

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

0
ArmağaN OlsuN

この問題は、ojdbcの古いバージョン-ojdbc14が原因です。

Ojdbc jarファイルの最新バージョンをアプリケーションまたは共有ライブラリに配置します。 (そこにあるのは1つのバージョンのみで、最新のバージョンでなければなりません)今日の時点-ojdbc6.jar

サーバー上のアプリケーションライブラリと共有ライブラリを確認します。

0
Teddy

私はこの問題に直面しています。 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.
0
niwotu
InputStream in = new FileInputStream(file);     
cstmt.setBinaryStream(1, in,file.length());  

これの代わりに、使用する必要があります

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