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です。
エラーメッセージから、何かが欠落しているように見えますが、
これは、クラスパスの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
ドライバー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をスローしていた一部のメソッドが、より合理的なことを行うようになったことです。
結果セットの保持性
複数の結果セットを返します。
JDBCでは、JDBCドライバーがJREに含まれているものよりも古いバージョンのJDBC APIを実装しているため、通常このエラーが発生します。これらの古いバージョンは、新しいAPIに登場したメソッドを試して使用しない限り問題ありません。
どのバージョンのJDBC setBinaryStream
が登場したのかわかりません。しばらくの間は存在していると思います。
にもかかわらず、JDBCドライバーのバージョン(10.2.0.4.0)はかなり古いため、11gでリリースされたバージョンにアップグレードすることをお勧めします(ダウンロード ここ )。
以下は、JDK APIがAbstractMethodErrorについて言っていることです。
アプリケーションが抽象メソッドを呼び出そうとするとスローされます。通常、このエラーはコンパイラーによってキャッチされます。このエラーは、現在実行中のメソッドが最後にコンパイルされてから、あるクラスの定義が非互換に変更された場合にのみ実行時に発生します。
Oracleドライバーのバグでしょうか?
ojdbc6.jar
をクラスパスに配置するだけで、CallbaleStatement
例外を修正できます。
Oracle.jdbc.driver.T4CPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V)
oracleで。
Java.sql.PreparedStatement.setBinaryStream()
のAPIで説明されているように、1.6以降で利用できるため、JDBC 4.0 API! JDBC 3 Driverを使用するため、このメソッドは使用できません!
私の場合、これはエラーでした。
スレッド「メイン」の例外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
Ojdb6.jarを使用するだけで、このような問題はすべて修正されます。
Mavenベースのアプリケーションの場合:
Ojdbc6.jarをダウンロードして、ローカルマシンのディレクトリにコピーします。
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
以下をプロジェクト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)にアップグレードすると、問題を解決できます。
クラスパスを慎重に調査することをお勧めします。 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"を削除して、問題を何度か再現したことを確認します。
JDBCドライバーからのエラーの原因は、Oracleデータベースに適したJDBCドライバーを取得する必要があると思います。から入手できます
http://www.Oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
この問題は、ojdbcの古いバージョン-ojdbc14が原因です。
Ojdbc jarファイルの最新バージョンをアプリケーションまたは共有ライブラリに配置します。 (そこにあるのは1つのバージョンのみで、最新のバージョンでなければなりません)今日の時点-ojdbc6.jar
サーバー上のアプリケーションライブラリと共有ライブラリを確認します。
私はこの問題に直面しています。 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());
これの代わりに、使用する必要があります
InputStream in = new FileInputStream(file);
cstmt.setBinaryStream(1, in,(int)file.length());