/ / c3p0 ResultSet.unwrap émet une erreur AbstractMethodError - oracle, jdbc, c3p0

c3p0 ResultSet.unwrap émet une erreur AbstractMethodError - oracle, jdbc, c3p0

J'ai un objet ResultSet que je dois activerdans un OracleResultSet afin que je puisse appeler la méthode getOPAQUE (String) dessus. J'utilise c3p0 comme pool de connexion. Le problème est que c3p0 encapsule ResultSets dans des objets NewProxyResultSet.

Cela ne devrait pas être un problème parce que je devrais pouvoir appeler unwrap sur le ResultSet comme ceci:

rs.unwrap(OracleResultSet.class)

Cependant, cela ne fonctionne pas. Il génère en fait un AbstractMethodError:

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

Il inclut une trace de pile, mais ce n’est pas utileparce que la ligne supérieure de la trace de pile pointe uniquement sur la ligne exacte sur laquelle j'appelle la méthode de décompression. Cela semble indiquer que NewProxyResultSet lui-même n'a pas implémenté de décompression.

Comment puis-je prendre un NewProxyResultSet et obtenir un OracleResultSet?

Réponses:

4 pour la réponse № 1

J'ai trouvé un moyen d'obtenir la valeur intérieure! C’est un bidouillage, mais ça marche. Si quelqu'un connaît un moyen plus portable d’obtenir la valeur interne (comme faire fonctionner la méthode de déroulement), alors j’adorerais le faire à la place.

Mais il s'avère que la variable "interne" du NewProxyResultSet est déclarée protégée. Je crée donc une classe dans le même package que NewProxyResultSet et l’utilise pour obtenir la valeur interne de la manière suivante:

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;
}
}