Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
Pages : 1