Aller au contenu

[Résolu][Java][SQL]Fermer une connexion à Oracle


windu.2b

Messages recommandés

Posté(e)

Bonsoir à tous,

J'ai semble-t-il un "petit" problème lors de l'exécution de requêtes SQL : au bout d'un moment, je me ramasse l'erreur suivante :

java.sql.SQLException: ORA-01000: Nombre maximum de curseurs ouverts atteint

Pourtant, toutes mes requêtes sont de cette forme :

ResultSet result = null;
try
{
// requete SQL exécutée
}
catch(SQLException e)
{}
finally
	{
		try
		{
			if( result != null )
			{
				//System.out.println( result );
				result.close();
			}
		}
		catch ( SQLException e )
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		manager.closeStatement();
	}

Donc je referme bien le ResultSet à chaque fois... Et la dernière ligne sert à refermer le Statement

Où se situerait mon problème ? :incline:

Posté(e)

Peut-être dans le "manager.closeStatement()" ?

Mais bon, de toute façon tu fermes manuellement le resultset avant...

Selon la doc de resultset :

  Citation
Note: A ResultSet object is automatically closed by the Statement object that generated it when that Statement object is closed, re-executed, or is used to retrieve the next result from a sequence of multiple results. A ResultSet object is also automatically closed when it is garbage collected.

Et celle de Statement :

  Citation
When a Statement object is closed, its current ResultSet object, if one exists, is also closed.

En tout cas je ne vois pas la faille dans ton code, sauf si ton "manager" lève des exceptions, car lever des exceptions depuis un bloc finally, caymal.

Posté(e)

Bon finalement, j'ai repris tous mes finally, j'ai modifié en mettant ceci :

finally
	{
		try
		{
			if( result != null )
			{
				manager.closeStatement();
				result.getStatement().close();
				result.close();
				result = null;
			}
		}
		catch ( SQLException e )
		{
			throw e;
		}
	}

Pour être sûr (et plus par précaution qu'autre chose car les tests semblaient concluants avant cela), j'ai même foutu des "manager.closeAllStatements()" (méthode que j'ai créé moi-même mais dont le nom me semble suffisamment explicite) à des endroits où je suis sûr que je ne risque rien de tout refermer, et ça a l'air bon...

Bref, sujet clos ! Merci Sentinel :incline:

Posté(e)

Non c'est encore pire, il ne faut jamais lever d'exceptions depuis un bloc "finally" ! Ca casse la pile d'appel de la méthode, et tu risques d'avoir des bugs totalement intraçables au runtime...

Il vaut mieux loguer les éventuelles exceptions et les "étouffer" plutôt que de les relancer depuis un finally

Posté(e)

Ah...

bon, ben je regarderai ça dans la semaine alors :yes:

Parce que l'appli corrigée est déjà repartie au client (mais il va faire de sretours, donc j'esayerai de "corriger" ça en même temps).

Merci pour l'info :craint:

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...