Jump to content

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


Recommended Posts

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:

Link to comment
Share on other sites

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

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

Selon la doc de resultset :

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 :

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.

Link to comment
Share on other sites

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:

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...