[hibernate-issues] [Hibernate-JIRA] Updated: (HHH-7020) Connection leak with nested sessions
Zoltán Holub (JIRA)
noreply at atlassian.com
Wed Feb 8 15:24:09 EST 2012
[ https://hibernate.onjira.com/browse/HHH-7020?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Zoltán Holub updated HHH-7020:
------------------------------
Attachment: HHH-7020.diff
I've made a patch for this issue.
The org/hibernate/engine/jdbc/internal/JdbcResourceRegistryImpl.java class contains some old commented out code, where exceptions are handled correctly.
I introduced the same exception handling in the new code, and it seems it fixed the problem.
> Connection leak with nested sessions
> ------------------------------------
>
> Key: HHH-7020
> URL: https://hibernate.onjira.com/browse/HHH-7020
> Project: Hibernate ORM
> Issue Type: Bug
> Components: core, entity-manager
> Affects Versions: 4.0.0.Final, 4.0.1, 4.1.0
> Environment: Windows 7.
> Java 1.6.0_25, Java 1.7.0
> Reporter: Zoltán Holub
> Attachments: HHH-7020.diff, testcase-connectionleak.zip
>
>
> I'am using a Hibernate interceptor to track data modifications. In the interceptor's onFlushDirty() method, i open a new session without interceptors using the same JDBC connection.
> After closing this nested session and the original entitymanager, the JDBC connection doesn't released.
> I could reproduce this problem outside any interceptor. I have made a junit test without interceptors which shows the same problem.
> I have found that Hibernate throws and catches a HibernateException with message "proxy handle is no longer valid". This exception is logged on debug level.
> I investigated that the problem is in the following code:
> LogicalConnectionImpl.java
> public Connection close() {
> LOG.trace( "Closing logical connection" );
> Connection c = isUserSuppliedConnection ? physicalConnection : null;
> try {
> releaseProxies();
> jdbcResourceRegistry.close();
> if ( !isUserSuppliedConnection && physicalConnection != null ) {
> releaseConnection();
> }
> return c;
> }
> finally {
> // no matter what
> physicalConnection = null;
> isClosed = true;
> LOG.trace( "Logical connection closed" );
> for ( ConnectionObserver observer : observers ) {
> observer.logicalConnectionClosed();
> }
> observers.clear();
> }
> }
> The invocation of jdbcResourceRegistry.close() throws this exception, and this is why it skips the following releaseConnection(). The condition of IF statement is true.
> This code is new to Hibernate 4. I have tried 4.0.0, 4.0.1 and 4.1.0-SNAPSHOT and all of them has the problem. Hibernate 3.6.0 is not affected.
> My JUnit test could run with Hibernate 3.x with minor changes. (3.x code also in the JUnit test)
> I have tried different ways to work around the problem. The only way it worked is to use a simple doWork() and native JDBC operations. This test case also in the unit test.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list