openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Albert Lee (JIRA)" <j...@apache.org>
Subject [jira] Updated: (OPENJPA-415) Garbage collection of AbstractResultList instance closes active connection
Date Wed, 24 Oct 2007 20:03:50 GMT

     [ https://issues.apache.org/jira/browse/OPENJPA-415?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Albert Lee updated OPENJPA-415:
-------------------------------

    Attachment: OPENJPA-415.patch

This patch has been tested against a test application ran for 20+ hours without error and
no undesirable heap growth.

> Garbage collection of AbstractResultList instance closes active connection
> --------------------------------------------------------------------------
>
>                 Key: OPENJPA-415
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-415
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: jdbc
>    Affects Versions: 1.0.1, 1.1.0
>            Reporter: Albert Lee
>            Assignee: Albert Lee
>         Attachments: OPENJPA-415.patch
>
>
> While investigation a problem, I noticed that garbage collection kicks in on the AbstractResultList's
finalize() method.
>         ........
>         at org.apache.openjpa.lib.jdbc.DelegatingConnection.close(DelegatingConnection.java:212)
>         at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection.close(LoggingConnectionDecorator.java:279)
>         at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$RefCountConnection.free(JDBCStoreManager.java:1288)
>         at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$RefCountConnection.close(JDBCStoreManager.java:1273)
>         at org.apache.openjpa.jdbc.sql.ResultSetResult.close(ResultSetResult.java:182)
>         at org.apache.openjpa.jdbc.kernel.SelectResultObjectProvider.close(SelectResultObjectProvider.java:148)
>         at org.apache.openjpa.lib.rop.WindowResultList.free(WindowResultList.java:158)
>         at org.apache.openjpa.lib.rop.WindowResultList.close(WindowResultList.java:78)
>         at org.apache.openjpa.lib.rop.AbstractResultList.finalize(AbstractResultList.java:89)
>         at java.lang.J9VMInternals.runFinalize(J9VMInternals.java:406)
> When traversing the call stack to the ResultSetResult.close() method, it is trying to
close the result set unconditionally, and then close the associated statement and connection
if they exists:
>     public void close() {
>         super.close();
>         try {
>             _rs.close();
>         } catch (SQLException se) {
>         }
>         if (_stmnt != null)
>             try {
>                 _stmnt.close();
>             } catch (SQLException se) {
>             }
>         if (_closeConn)
>             try {
>                 _conn.close();
>             } catch (SQLException se) {
>             }
>     }
> Would this be a undesired side-effect and a problem in the following scenario:
> 1)  appl / openjpa obtains a connection
> 2)  create a prepare statement 
> 3)  get a result set from the statement
> 4)  using the same statement and get another result set. The first result set is not
being referenced by any code and ready for gc.
> 5)  the connection and statement is active for a long time and gc kicks in to gc the
first result set instance
> 6)  eventually the ResultSetResult.close() gets call.
> 7)  The statement and connection gets closed while it is still being used by appl / openjpa.
> Is this a possible scenario? 
> According to the JCA architecture, connection that is scoped to a transaction will be
closed by the connection manager and all associated statements and result set managed by the
connection will be automatically closed. So is the AbstractResultList.finalize() ever be needed
at all? 
> Albert Lee.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message