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

Albert Lee closed OPENJPA-415.
------------------------------


> 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
>             Fix For: 1.0.1, 1.1.0
>
>         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.

Reply via email to