Обсуждение: Memory leak ?
<font face="Xerox Sans">With this code :<br /></font> <pre>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
(SQLExceptione) { } 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("selectf_transite(?,'FPL','225',9,'test','','')"); }
public static void rollBack() { try { connDB.rollback(); } catch(SQLException
ex) { } }
}</pre> In eclipse Helios profiler, Jdbc3ResultSet live instances increase (and never decrease). Same thing with
org.postgresql.core.v3.QueryExecutorImpl$ErrorTrackingResultHandlerand org.postgresql.core.v3.QueryExecutorImpl$1
classes.<br/><br /> f_transite stored procedure make some select, insert and update. If you need more explanation, i
cangive it to you.<br /><br /> Java 6<br /> postgresql-9.0-801.jdbc3.jar<br /> 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)<br/><br /> Is it a memory leak ? Or my java code is wrong ?<br /><br /><div class="moz-signature"><font
color="#000080"face="Arial" size="2"><b>Pierre LE MOUËLLIC<br /></b></font><font color="#000080" face="Arial"
size="1"><br/></font> <a href="mailto:pierre.lemouellic@xgs-france.com" moz-do-not-send="true"><font color="blue"
size="1"><u>pierre.lemouellic@xgs-france.com</u></font></a><br/><a href="mailto:pierre.lemouellic@xgs-france.com"
moz-do-not-send="true"><fontcolor="blue" size="1"><u></u></font></a></div>
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 >
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>
Same problem with adding rs.close() :<br /><br /> sQLStatement.setInt(1, 2602);<br /> rs =
sQLStatement.executeQuery();<br/> rs.close();<br /><br /> sQLStatement.setInt(1, 2604);<br /> rs =
sQLStatement.executeQuery();<br/> rs.close();<br /><br /> sQLStatement.setInt(1, 2605);<br /> rs =
sQLStatement.executeQuery();<br/> rs.close();<br /><br /><div class="moz-signature"><font color="#000080" face="Arial"
size="2"><b>PierreLE MOUËLLIC<br /><br /></b></font><a href="mailto:pierre.lemouellic@xgs-france.com"
moz-do-not-send="true"><fontcolor="blue" size="1"><u></u></font></a></div><br /> Le 06/04/2011 12:30, Mikko Tiihonen a
écrit :<blockquote cite="mid:4D9C40BA.3080606@nitorcreations.com" type="cite">On 06/04/11 13:11, Pierre Le Mouëllic
wrote:<br /><blockquote type="cite">With this code : <br /><br /> public class TestJDBC { <br /><br /> private
staticTimer timer; <br /><br /> private static Connection connDB; <br /> private static PreparedStatement
sQLStatement;<br /><br /> public static void main(String[] args) throws SQLException, ClassNotFoundException { <br
/><br/> connexion("jdbc:postgresql://praslin.qual.dc1:5432/G01DPM","postgres8","password");<br /><br />
timer = new Timer(); <br /> timer.schedule(new local_task(), 1000L, 1000); <br /> } <br /><br />
static class local_task extends TimerTask { <br /><br /> public void run() { <br /> ResultSet
rs=null;<br /> try { <br /> sQLStatement.setInt(1, 2602); <br /> rs =
sQLStatement.executeQuery();<br /></blockquote><br /> Missing <br /> rs.close(); <br /><br /><blockquote
type="cite"> sQLStatement.setInt(1, 2604); <br /> rs = sQLStatement.executeQuery(); <br
/></blockquote><br/> Missing <br /> rs.close(); <br /><br /><blockquote type="cite">
sQLStatement.setInt(1,2605); <br /> rs = sQLStatement.executeQuery(); <br /> } catch
(SQLExceptione) { <br /> } <br /> finally{ <br /><br /> try { <br />
if(rs!=null) <br /> rs.close(); <br /> } catch
(SQLExceptione) { <br /> } <br /></blockquote> > <br /><blockquote type="cite">
rollBack();<br /> } <br /> } <br /> } <br /><br /> public static void connexion(String
chemin,String user, String password) throws SQLException, ClassNotFoundException <br /> { <br />
Class.forName("org.postgresql.Driver");<br /> String url = chemin+"?user="+user+"&password="+password; <br
/><br/> // Connexion <br /> connDB = DriverManager.getConnection(url); <br />
connDB.setAutoCommit(false);<br /> initPreparedStatement(); <br /> } <br /><br /> private static
voidinitPreparedStatement() throws SQLException <br /> { <br /> sQLStatement =
connDB.prepareStatement("selectf_transite(?,'FPL','225',9,'test','','')"); <br /> } <br /><br /> public
staticvoid rollBack() <br /> { <br /></blockquote> > <br /><blockquote type="cite"> try <br />
{<br /> connDB.rollback(); <br /> } <br /> catch(SQLException ex) <br /> { <br
/> } <br /> } <br /> } <br /><br /> In eclipse Helios profiler, Jdbc3ResultSet live instances increase
(andnever decrease). Same thing with <br /> org.postgresql.core.v3.QueryExecutorImpl$ErrorTrackingResultHandler and
org.postgresql.core.v3.QueryExecutorImpl$1classes. <br /><br /> f_transite stored procedure make some select, insert
andupdate. If you need more explanation, i can give it to you. <br /><br /> Java 6 <br /> postgresql-9.0-801.jdbc3.jar
<br/> 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) <br /><br /> Is it a memory leak ? Or my java code is wrong ? <br /><br /> *Pierre LE
MOUËLLIC<br /> * <br /> _pierre.lemouellic@xgs-france.com_ <a class="moz-txt-link-rfc2396E"
href="mailto:pierre.lemouellic@xgs-france.com"><mailto:pierre.lemouellic@xgs-france.com></a><br/> __ <a
class="moz-txt-link-rfc2396E"
href="mailto:pierre.lemouellic@xgs-france.com"><mailto:pierre.lemouellic@xgs-france.com></a><br/></blockquote><br
/><br/></blockquote>
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