c3p0 ResultSet.unwrap抛出一个AbstractMethodError

时间:2009-12-28 21:21:32

标签: oracle jdbc c3p0

我有一个ResultSet对象,我需要将其转换为OracleResultSet,以便我可以在其上调用getOPAQUE(String)方法。我正在使用c3p0作为我的连接池。问题是c3p0将ResultSets包装在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本身没有实现解包。

这是怎么回事?如何从中获取NewProxyResultSet并从中获取OracleResultSet?

1 个答案:

答案 0 :(得分:4)

我找到了获得内在价值的方法!这是一个黑客,但它的工作原理。如果有人知道一种更便携的获取内在价值的方式(比如让解包方法有效),那么我很乐意这样做。

但事实证明,NewProxyResultSet的“inner”变量被声明为protected。所以我只是在与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;
}
}