Issues with calling stored prcedures - Mailing list pgsql-jdbc

From Tim McAuley
Subject Issues with calling stored prcedures
Date
Msg-id 3F4B9DDC.2090602@tcd.ie
Whole thread Raw
Responses Re: Issues with calling stored prcedures
List pgsql-jdbc
Hi,

A few days ago we found a memory leak (or what looked like one) under
our J2EE application running under JBoss.

I've managed to track it down to a section of code that calls a stored
procedure on our Postgresql database. Are there any known issues with
calling stored procedures through JDBC calls? We've been doing this for
a while but never ran any memory leak tests on the system. I am finding
an approximate leak of 10MB for 1000 calls to this code.

I have tried two different styles of calling the stored procedure with
no noticeable difference and also calling a plain SQL query. The SQL
query does not exhibit the same memory leak.

Should the complexity of the stored procedure have any bearing on the
calling java code (or the fact that the stored procedure calls other sub
functions?). I shouldn't have thought so but this stored procedure is
fairly complex.

Has anyone else seen behavior like this? It's baffling me currently.

Code snippets (statement and connections are closed after use):

// Original code

            PreparedStatement statement =
dbConnection.prepareStatement("select storedProcedureName(?, ?)");
            statement.setLong(1, longValue1.longValue());
            statement.setLong(2, longValue2.longValue());
            ResultSet rs = statement.executeQuery();

            if (rs.next())
            {
                int resultCount = rs.getInt("storedProcedureName");
            }

// Using modified code for calling the stored procedure.

            boolean autoCommitStatus = dbConnection.getAutoCommit();
            dbConnection.setAutoCommit(false);

            CallableStatement statement = dbConnection.prepareCall("{ ?
= call storedProcedureName(?, ?) }");
            statement.registerOutParameter(1, Types.INTEGER);
            statement.setLong(2, longValue1.longValue());
            statement.setLong(3, longValue2.longValue());
            statement.execute();

            int resultCount = statement.getInt(1);

            dbConnection.setAutoCommit(autoCommitStatus);


// Plain SQL query

            PreparedStatement statement =
dbConnection.prepareStatement("select count(*) from currentTable where
id = ?");
            statement.setLong(1, longValue1.longValue());
            ResultSet rs = statement.executeQuery();

            if (rs.next())
            {
                int resultCount = rs.getInt(1);
            }

Environment:
Postgresql 7.3.2 (Running on Redhat 9 Linux)
JBoss (3.2.2RC2), Java 1.4.2 (running on local Windows 2000 PC)

Original leak was exhibited on Linux using JBoss 3.0.7 using Java
1.4.1_02 and change of these two had not noticeable affect.

We are using our own JDBC driver compiled from the 7.3.2 sourcecode and
modified to handle long indexes. I have just tried the latest stable
driver from the jdbc.postgresql website and that has made no difference.





pgsql-jdbc by date:

Previous
From: Dave Cramer
Date:
Subject: Re: SQLState Implementation
Next
From: Dave Cramer
Date:
Subject: Re: SQLState Implementation