2009-12-28 249 views
2

我有一個ResultSet對象,我需要把它變成一個OracleResultSet,以便我可以調用它的getOPAQUE(String)方法。我使用c3p0作爲連接池。問題是c3p0包裝NewProxyResultSet對象中的ResultSets。c3p0 ResultSet.unwrap拋出一個AbstractMethodError

這不應該是一個問題,因爲我應該能夠調用解包上的ResultSet是這樣的:

rs.unwrap(OracleResultSet.class) 

然而,這是行不通的。它實際上拋出的AbstractMethodError:

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

它包括一個堆棧跟蹤,但由於堆棧跟蹤的頂線只是點到,我稱之爲解包方法精確線是沒有幫助的。這似乎表明NewProxyResultSet本身沒有實現unwrap。

這是怎麼回事?我如何獲取NewProxyResultSet並從中獲取OracleResultSet?

回答

4

我想出了一種獲得內在價值的方法!這是一個黑客,但它的工作原理。如果有人知道獲取內部價值的更便捷的方式(比如使解包方法起作用),那麼我願意這樣做。

但是,事實證明NewProxyResultSet的「內部」變量被聲明爲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; 
} 
} 
+0

順便說一句,我曾與C3P0問題爲好。它沒有正確地進行交易。請參閱http://stackoverflow.com/questions/1977366/spring-transactional-cpool-which-one-do-i-use/2002505#2002505瞭解我是如何做到的完整說明。 – HappyEngineer 2010-01-04 22:04:07

相關問題