Vous n'êtes pas identifié(e).

#1 06/04/2011 11:09:16

pierrelm
Membre

[JDBC] Soupçon de fuite memoire

J'ai le code suivant :

public class TestJDBC {


	/** Creation du logger */
	private final static Logger LOGGER = Logger.getLogger(TestJDBC.class);

	private static Timer timer;

	private static Connection connDB;
	private static PreparedStatement sQLStatement;

	public static void main(String[] args) throws SQLException, ClassNotFoundException {

		connexion("jdbc:postgresql://praslin.qual.dc1:5432/G01DPM", "postgres8", "password");
		
		timer = new Timer();
		timer.schedule(new local_task(), 1000L, 1000);	
	}

	static class local_task extends TimerTask {

		public void run() {
			ResultSet rs=null;
			try {
				sQLStatement.setInt(1, 2602);
				rs = sQLStatement.executeQuery();
				LOGGER.debug(sQLStatement.toString());
				sQLStatement.setInt(1, 2604);
				rs = sQLStatement.executeQuery();
				LOGGER.debug(sQLStatement.toString());
				sQLStatement.setInt(1, 2605);
				rs = sQLStatement.executeQuery();
				LOGGER.debug(sQLStatement.toString());
			} catch (SQLException e) {
				LOGGER.error(e,e);
			}
			finally{

				try {
					if(rs!=null)
						rs.close();
				} catch (SQLException e) {
					LOGGER.error(e,e);
				}
				rollBack();
			}
		}
	}

	public static void connexion(String chemin, String user, String password) throws SQLException, ClassNotFoundException
	{
		LOGGER.info("Connexion a la BDD");
		Class.forName("org.postgresql.Driver");
		String url = chemin+"?user="+user+"&password="+password;

		//	Connexion
		connDB = DriverManager.getConnection(url);
		connDB.setAutoCommit(false);
		initPreparedStatement();
	}

	private static void initPreparedStatement() throws SQLException
	{
		sQLStatement = connDB.prepareStatement("select f_transite(?,'FPL','225',9,'test','','')");
	}

	public static void rollBack()
	{
		try
		{
			connDB.rollback();
		}
		catch(SQLException ex)
		{
			LOGGER.error("Erreur lors du rollback ",ex);
		}
	}
}

Avec le profiler d'eclipse, le nombre d'instances actives de org.postgresql.jdbc3.Jdbc3ResultSet augmente sans jamais redescendre.

La procédure stockée appelée f_transite réalise des updates et des insert. Si nécessaire, je peux donner plus d'indications.

Librairie utilisée : postgresql-9.0-801.jdbc3.jar
Java 6

Qu'en pensez-vous ? Erreur dans mon code ? Fuite mémoire ?

Hors ligne

#2 07/04/2011 10:17:16

flo
Membre

Re : [JDBC] Soupçon de fuite memoire

Vous utilisez plusieurs fois le même resultset, sans le fermer. Normalement on n'utilise un resultset que pour 1 requête( 1 seul execute ou executeQuery)

Hors ligne

#3 07/04/2011 10:59:09

pierrelm
Membre

Re : [JDBC] Soupçon de fuite memoire

Bonjour,

Ce ne pose pas de problème et d'après la mailing list de postgresql-jdbc, il n'est pas obligatoire de fermer un resultset.

En réalité, il n'y a pas de souci, il faut juste être patient et le gc finit par passer.

Hors ligne

Pied de page des forums