[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-3359) Loader leaks memory when ResultSet wrapping is enabled

Bernardo Orilio Bennett (JIRA) noreply at atlassian.com
Thu Mar 25 05:47:32 EDT 2010


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-3359?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=35950#action_35950 ] 

Bernardo Orilio Bennett commented on HHH-3359:
----------------------------------------------

The proposed solution (implementing equals and hash code) worked for me.

> Loader leaks memory when ResultSet wrapping is enabled
> ------------------------------------------------------
>
>                 Key: HHH-3359
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3359
>             Project: Hibernate Core
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 3.2.6, 3.3.0.CR1
>         Environment: Hibernate 3.2.6 GA, Oracle 10g database, Oracle JDBC drivers 10.2.0.1.0 for JDK14
>            Reporter: Frans Flippo
>            Priority: Minor
>         Attachments: ResultSetWrapper.java
>
>
> This issue was already reported on the forums (http://forum.hibernate.org/viewtopic.php?t=968578), but I can find no actual JIRA entry. The issue is that when the hibernate.jdbc.wrap_result_sets property is set to true, ResultSets are never removed from the AbstractBatcher's resultSetsToClose set, eventually causing memory to fill up with ResultSet objects and their associated resources (like PreparedStatements).
> This issue was witnessed in 3.2.6, but a look at the 3.3 CR1 source code reveals that it's still in there.
> What happens:
> 1) org.hibernate.loader.Loader.doQuery calls org.hibernate.loader.Loader.getResultSet
> 2) org.hibernate.loader.Loader.getResultSet calls Batcher.getResultSet. The AbstractBatcher implementation creates a ResultSet by executing the query and adds it to the AbstractBatcher's resultSetsToClose Set
> 3) Loader then calls its wrapResultSetIfEnabled method to wraps the ResultSet in a ResultSetWrapper if the wrap_result_sets option is enabled.
> 4) In Loader.doQuery's finally block, Batcher.closeQueryStatement is called with the PreparedStatement and the *wrapped* ResultSet as parameters
> 5) closeQueryStatement does:
> 				if ( resultSetsToClose.remove( rs ) ) {
> 					logCloseResults();
> 					rs.close();
> 				}
> 6) resultSetsToClose.remove(rs) will always return false if the ResultSet was wrapped, as ResultSetWrapper does not override equals()/hashCode() (and therefore inherits Object's equals() and hashCode()). This means the reference to the original (unwrapped) ResultSet remains (is not removed from the Set) and the ResultSet is not closed either as a result.
> Workaround: Set hibernate.jdbc.wrap_result_sets to false
> Solution: implement ResultSetWrapper.equals()/hashCode() (see attached ResultSetWrapper.java)

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list