Обсуждение: Memory leak ?

Поиск
Список
Период
Сортировка

Memory leak ?

От
Pierre Le Mouëllic
Дата:
With this code :
public class TestJDBC {
   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();               sQLStatement.setInt(1, 2604);               rs = sQLStatement.executeQuery();               sQLStatement.setInt(1, 2605);               rs = sQLStatement.executeQuery();           } catch (SQLException e) {           }           finally{
               try {                   if(rs!=null)                       rs.close();               } catch (SQLException e) {               }               rollBack();           }       }   }
   public static void connexion(String chemin, String user, String password) throws SQLException, ClassNotFoundException   {       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)       {       }   }
}
In eclipse Helios profiler, Jdbc3ResultSet live instances increase (and never decrease). Same thing with org.postgresql.core.v3.QueryExecutorImpl$ErrorTrackingResultHandler and org.postgresql.core.v3.QueryExecutorImpl$1 classes.

f_transite stored procedure make some select, insert and update. If you need more explanation, i can give it to you.

Java 6
postgresql-9.0-801.jdbc3.jar
PostgreSQL 8.2.5 on powerpc-apple-darwin8.8.0, compiled by GCC powerpc-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5363)

Is it a memory leak ? Or my java code is wrong ?

Re: Memory leak ?

От
Dave Cramer
Дата:
The garbage collector should be collecting those, so I would guess the
driver is holding a reference internally to the result set.

Dave Cramer

dave.cramer(at)credativ(dot)ca
http://www.credativ.ca




2011/4/6 Pierre Le Mouëllic <pierre.lemouellic@xgs-france.com>:
> With this code :
>
> public class TestJDBC {
>
>     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();
>                 sQLStatement.setInt(1, 2604);
>                 rs = sQLStatement.executeQuery();
>                 sQLStatement.setInt(1, 2605);
>                 rs = sQLStatement.executeQuery();
>             } catch (SQLException e) {
>             }
>             finally{
>
>                 try {
>                     if(rs!=null)
>                         rs.close();
>                 } catch (SQLException e) {
>                 }
>                 rollBack();
>             }
>         }
>     }
>
>     public static void connexion(String chemin, String user, String
> password) throws SQLException, ClassNotFoundException
>     {
>         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)
>         {
>         }
>     }
> }
>
> In eclipse Helios profiler, Jdbc3ResultSet live instances increase (and
> never decrease). Same thing with
> org.postgresql.core.v3.QueryExecutorImpl$ErrorTrackingResultHandler and
> org.postgresql.core.v3.QueryExecutorImpl$1 classes.
>
> f_transite stored procedure make some select, insert and update. If you need
> more explanation, i can give it to you.
>
> Java 6
> postgresql-9.0-801.jdbc3.jar
> PostgreSQL 8.2.5 on powerpc-apple-darwin8.8.0, compiled by GCC
> powerpc-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build
> 5363)
>
> Is it a memory leak ? Or my java code is wrong ?
>
> Pierre LE MOUËLLIC
>
> pierre.lemouellic@xgs-france.com
>

Re: Memory leak ?

От
Mikko Tiihonen
Дата:
On 06/04/11 13:11, Pierre Le Mouëllic wrote:
> With this code :
>
> public class TestJDBC {
>
>      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();

Missing
rs.close();

>                  sQLStatement.setInt(1, 2604);
>                  rs = sQLStatement.executeQuery();

Missing
rs.close();

>                  sQLStatement.setInt(1, 2605);
>                  rs = sQLStatement.executeQuery();
>              } catch (SQLException e) {
>              }
>              finally{
>
>                  try {
>                      if(rs!=null)
>                          rs.close();
>                  } catch (SQLException e) {
>                  }
 >
>                  rollBack();
>              }
>          }
>      }
>
>      public static void connexion(String chemin, String user, String password) throws SQLException,
ClassNotFoundException
>      {
>          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)
>          {
>          }
>      }
> }
>
> In eclipse Helios profiler, Jdbc3ResultSet live instances increase (and never decrease). Same thing with
> org.postgresql.core.v3.QueryExecutorImpl$ErrorTrackingResultHandler and org.postgresql.core.v3.QueryExecutorImpl$1
classes.
>
> f_transite stored procedure make some select, insert and update. If you need more explanation, i can give it to you.
>
> Java 6
> postgresql-9.0-801.jdbc3.jar
> PostgreSQL 8.2.5 on powerpc-apple-darwin8.8.0, compiled by GCC powerpc-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple
Computer,Inc. build 5363) 
>
> Is it a memory leak ? Or my java code is wrong ?
>
> *Pierre LE MOUËLLIC
> *
> _pierre.lemouellic@xgs-france.com_ <mailto:pierre.lemouellic@xgs-france.com>
> __ <mailto:pierre.lemouellic@xgs-france.com>


Re: Memory leak ?

От
Pierre Le Mouëllic
Дата:
Same problem with adding rs.close() :

sQLStatement.setInt(1, 2602);
rs = sQLStatement.executeQuery();
rs.close();

sQLStatement.setInt(1, 2604);
rs = sQLStatement.executeQuery();
rs.close();

sQLStatement.setInt(1, 2605);
rs = sQLStatement.executeQuery();
rs.close();

Pierre LE MOUËLLIC


Le 06/04/2011 12:30, Mikko Tiihonen a écrit :
On 06/04/11 13:11, Pierre Le Mouëllic wrote:
With this code :

public class TestJDBC {

     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();

Missing
rs.close();

                 sQLStatement.setInt(1, 2604);
                 rs = sQLStatement.executeQuery();

Missing
rs.close();

                 sQLStatement.setInt(1, 2605);
                 rs = sQLStatement.executeQuery();
             } catch (SQLException e) {
             }
             finally{

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

     public static void connexion(String chemin, String user, String password) throws SQLException, ClassNotFoundException
     {
         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)
         {
         }
     }
}

In eclipse Helios profiler, Jdbc3ResultSet live instances increase (and never decrease). Same thing with
org.postgresql.core.v3.QueryExecutorImpl$ErrorTrackingResultHandler and org.postgresql.core.v3.QueryExecutorImpl$1 classes.

f_transite stored procedure make some select, insert and update. If you need more explanation, i can give it to you.

Java 6
postgresql-9.0-801.jdbc3.jar
PostgreSQL 8.2.5 on powerpc-apple-darwin8.8.0, compiled by GCC powerpc-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5363)

Is it a memory leak ? Or my java code is wrong ?

*Pierre LE MOUËLLIC
*
_pierre.lemouellic@xgs-france.com_ <mailto:pierre.lemouellic@xgs-france.com>
__ <mailto:pierre.lemouellic@xgs-france.com>


Re: Memory leak ?

От
Lew
Дата:
Mikko Tiihonen wrote:
> Pierre Le Mouëllic wrote:
>> With this code :
>>
>> public class TestJDBC {
>>
>>      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();

> Missing
> rs.close();

Not needed.

 From <http://download.oracle.com/javase/6/docs/api/java/sql/ResultSet.html>:

"A ResultSet object is automatically closed when the Statement object that
generated it is closed, re-executed, or used to retrieve the next result from
a sequence of multiple results."


>>                  sQLStatement.setInt(1, 2604);
>>                  rs = sQLStatement.executeQuery();

> Missing
> rs.close();

Nope.

In fact, it's rather an antipattern to call 'ResultSet#close()' explicitly.

>>                  sQLStatement.setInt(1, 2605);
>>                  rs = sQLStatement.executeQuery();
>>              } catch (SQLException e) {
>>              }
>>              finally{
>>
>>                  try {
>>                      if(rs!=null)
>>                          rs.close();

What's bizarre here is that we aren't closing the statement.

That's weird.

>>                  } catch (SQLException e) {
>>                  }
>>
>>                  rollBack();
>>              }
>>          }
>>      }

--
Lew
Honi soit qui mal y pense.
http://upload.wikimedia.org/wikipedia/commons/c/cf/Friz.jpg