Merci d'avoir fait suivre la r�ponse. M�me si je trouve la solution un peu ch�re en CPU pour un simple isClosed, cette solution est superbe et va me permettre d'am�liorer mes techniques de d�boguage.
Merci Dominique, Cordialement, -------------------------------------------------------------------- Erik Mazoyer, Chef de projet HyperOffice 6, rue Jacques Daguerre - 92565 Rueil-Malmaison Cedex T�l. 01 41 96 96 76 Fax 01 41 96 96 77 M�l [EMAIL PROTECTED] -----Message d'origine----- De : Laurent For�t [mailto:[EMAIL PROTECTED] Envoy� : vendredi 7 mars 2003 16:49 � : [EMAIL PROTECTED] Objet : Fw: Resultset et close() Voil� un exemple de r�ponse, dont tout le monde ne peut pas profiter � cause de mon probl�me de messagerie. D�sol� ;)! Laurent For�t. ----- Original Message ----- From: "Dominique Gallot" <[EMAIL PROTECTED]> To: "Laurent For�t" <[EMAIL PROTECTED]> Sent: Friday, March 07, 2003 3:41 PM Subject: Re: Resultset et close() > > Faire ceci > > .......... > > > Simple non ? En tout cas c'est une tres bonne facon de faire, avec un Proxy > ! > > Dominique > -------------------------------------------- SAVE THIS TO Test.java > --------------------------- > > > > import java.lang.reflect.*; > import java.sql.*; > > public class Test > { > static class ClosedResultSet implements InvocationHandler > { > private Object obj; > public boolean closed = false; > public ClosedResultSet (Object o ) > { > obj = o; > } > public Object invoke(Object proxy, Method m, Object[] args) throws > Throwable > { > Object result; > try { > result = m.invoke(obj, args); > if ( m.getName().equals("close") ) > { > closed = true; > } > } catch (InvocationTargetException e) { > throw e.getTargetException(); > } > return result; > } > public boolean isClosed() > { > return closed; > } > > } > > public static void maMethodQuiPeutFermer(ResultSet rs) throws > SQLException > { > if ( rs.next() ) > rs.close(); > } > > public static void main ( String[] args ) throws Exception > { > Statement stmt = null; > ResultSet rs = stmt.executeQuery("select blalalala "); > ClosedResultSet crs = new ClosedResultSet (rs); > rs = ( ResultSet) java.lang.reflect.Proxy.newProxyInstance( > rs.getClass().getClassLoader(), > new Class[]{ResultSet.class}, crs ); > > maMethodQuiPeutFermer(rs); > if ( crs.isClosed() ) > { > System.err.println("Oppps closed"); > } else > { > rs.close(); > } > } > } > > > > > > Laurent For�t <[EMAIL PROTECTED] To: <[EMAIL PROTECTED]> > com> cc: (bcc: Dominique Gallot/BRU/MASTERCARD) > Subject: Re: Resultset et close() > 07/03/2003 12:14 > Please respond to > Laurent For�t > > > > > > Tout a fait exact, comme je travaille toujours sur une m�me base, j'avais > omis ce d�tail. > > Pour la m�thode isClosed(), ca serait trop simple;) ! > > Peut �tre faire la remarque � JCP pour qu'il modifie l'API JDBC. > > Laurent For�t. > > ----- Original Message ----- > From: "Erik Mazoyer" <[EMAIL PROTECTED]> > To: "Laurent For�t" <[EMAIL PROTECTED]> > Sent: Friday, March 07, 2003 11:54 AM > Subject: RE: Resultset et close() > > > > > ...puis regarder l'�galit� du message, en clair. > > > > Le probl�me est que ce message est d�pendant de la base de donn�e. > > Je peux tr�s bien recevoir : > > "The Resulset is closed" > > ou > > "L'ensemble des r�sultats est d�j� ferm�". > > > > Une analyse g�n�rique me semble impossible. > > > > Bref, j'ai bien l'impression qu'il n'y a pas de solution. > > Ce serait pourtant si simple une m�thode : > > public boolean isClosed() throws SQLException > > > > Merci, > > > > -------------------------------------------------------------------- > > Erik Mazoyer, Chef de projet > > HyperOffice > > 6, rue Jacques Daguerre - 92565 Rueil-Malmaison Cedex > > T�l. 01 41 96 96 76 > > Fax 01 41 96 96 77 > > M�l [EMAIL PROTECTED] > > > > > > -----Message d'origine----- > > De : Laurent For�t [mailto:[EMAIL PROTECTED] > > Envoy� : vendredi 7 mars 2003 11:48 > > � : [EMAIL PROTECTED] > > Objet : Re: Resultset et close() > > > > > > Un truc affreux mais qui doit marcher est de rep�rer le message qui est > > renvoy� par l'exception dans le cas o� le rs est d�ja fermer. > > puis regarder l'�galiter du message, en clair : > > > > if(rs != null) { > > try { > > rs.close(); > > } catch(SQLException sqlex) { > > if ( ! sqlEx.getMessage().equals("SQL already CLOSED)) { > > throw sqlEx; > > } > > } > > > > laurent Foret. > > > > ----- Original Message ----- > > From: "Erik Mazoyer" <[EMAIL PROTECTED]> > > To: <[EMAIL PROTECTED]> > > Sent: Friday, March 07, 2003 11:33 AM > > Subject: Resultset et close() > > > > > > > J'ai une m�thode qui ouvre un java.sql.ResultSet sur une base de > donn�e. > > > Dans le finally de la m�thode, je referme le ResultSet (m�thode > close()). > > > > > > ResultSet rs = null; > > > try { > > > ... > > > rs = stmt.executeQuery(...); > > > ... > > > } finally { > > > if(rs != null) { > > > rs.close(); > > > } > > > } > > > > > > Le probl�me est qu'au cours de la m�thode ce ResultSet peut �tre ferm� > ou > > non (la m�thode n'est pas en mesure de le savoir). > > > > > > Je n'ai pas trouv� de solution pour d�termin� si un ResultSet est ferm� > ou > > non. > > > > > > Si je le ferme � nouveau le ResultSet dans le finally, une exception > est > > lev�e. > > > Mais h�las elle est de type SQLException, ce qui n'est pas sp�cifique. > > > > > > Bref pour l'instant la seule solution trouv�e est de ne pas tenir > compte > > de l'exception lev�e par le close. > > > > > > } finally { > > > if(rs != null) { > > > try { > > > rs.close(); > > > } catch(SQLException sqlex) {} > > > } > > > } > > > Mais cela masque aussi toutes les autres raisons pour lesquelles le > close > > n'a pu avoir lieu, ce qui nuit au d�boguage. > > > > > > public void close() > > > throws SQLException > > > ... > > > Throws: > > > SQLException - if a database access error occurs > > > > > > Bref, avez vous une solution � me proposer ? > > > > > > Merci, > > > > > > -------------------------------------------------------------------- > > > Erik Mazoyer, Chef de projet > > > HyperOffice > > > 6, rue Jacques Daguerre - 92565 Rueil-Malmaison Cedex > > > T�l. 01 41 96 96 76 > > > Fax 01 41 96 96 77 > > > M�l [EMAIL PROTECTED] > > > > > > > > > > > > > > > > ********************************************************************** > This email and any files transmitted with it are confidential and > intended solely for the use of the individual or entity to whom they > are addressed. If you have received this email in error please notify > the system manager. > > This footnote also confirms that this email message has been swept by > MIMEsweeper for the presence of computer viruses. > > www.mimesweeper.com > ********************************************************************** > >
