2

getOPAQUE(String) メソッドを呼び出すことができるように、OracleResultSet に変換する必要がある ResultSet オブジェクトがあります。接続プールとして c3p0 を使用しています。問題は、c3p0 が ResultSet を NewProxyResultSet オブジェクトにラップすることです。

次のように ResultSet で unwrap を呼び出すことができるはずなので、これは問題になりません。

rs.unwrap(OracleResultSet.class)

しかし、それはうまくいきません。実際には AbstractMethodError をスローします。

java.lang.AbstractMethodError: com.mchange.v2.c3p0.impl.NewProxyResultSet.unwrap(Ljava/lang/Class;)Ljava/lang/Object;

これにはスタック トレースが含まれていますが、スタック トレースの一番上の行は、unwrap メソッドを呼び出した正確な行を指しているだけなので、役に立ちません。これは、NewProxyResultSet 自体に unwrap が実装されていないことを示しているようです。

これどうしたの?NewProxyResultSet を取得してそこから OracleResultSet を取得するにはどうすればよいですか?

4

1 に答える 1

4

内部値を取得する方法を見つけました。これはハックですが、機能します。内部値を取得するためのより移植性の高い方法 (unwrap メソッドを機能させるなど) を誰かが知っている場合は、代わりにそれを実行したいと思います。

しかし、NewProxyResultSet の「内部」変数が保護されていることがわかりました。したがって、NewProxyResultSet と同じパッケージにクラスを作成し、それを使用して次のように内部値を取得します。

package com.mchange.v2.c3p0.impl;

import java.sql.ResultSet;

/**
 * This is a sneaky way to get at the inner ResultSet of NewProxyResultSet. It marks the     variable as protected,
 * so here I just make a class in the same package and get the value out. 
 *
 */
public class C3P0ResultSetPeeker
{
public static ResultSet getInnerFrom(NewProxyResultSet rs) {
    return rs.inner;
}
}
于 2009-12-29T00:50:12.863 に答える