From: <hib...@li...> - 2006-03-10 17:08:41
|
Author: ste...@jb... Date: 2006-03-10 12:08:38 -0500 (Fri, 10 Mar 2006) New Revision: 9593 Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/event/def/AbstractFlushingEventListener.java branches/Branch_3_1/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java Log: HHH-1555 : maintain connections during flush even with aggressive release Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/event/def/AbstractFlushingEventListener.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/event/def/AbstractFlushingEventListener.java 2006-03-10 09:47:11 UTC (rev 9592) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/event/def/AbstractFlushingEventListener.java 2006-03-10 17:08:38 UTC (rev 9593) @@ -289,6 +289,7 @@ log.trace("executing flush"); try { + session.getJDBCContext().getConnectionManager().flushBeginning(); // we need to lock the collection caches before // executing entity inserts/updates in order to // account for bidi associations @@ -299,6 +300,9 @@ log.error("Could not synchronize database state with session", he); throw he; } + finally { + session.getJDBCContext().getConnectionManager().flushEnding(); + } } Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java 2006-03-10 09:47:11 UTC (rev 9592) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java 2006-03-10 17:08:38 UTC (rev 9593) @@ -46,6 +46,7 @@ private transient Batcher batcher; private transient Interceptor interceptor; private boolean isClosed; + private transient boolean isFlushing; /** * Constructs a ConnectionManager. @@ -261,7 +262,10 @@ */ public void afterStatement() { if ( isAggressiveRelease() ) { - if ( batcher.hasOpenResources() ) { + if ( isFlushing ) { + log.debug( "skipping aggressive-release due to flush cycle" ); + } + else if ( batcher.hasOpenResources() ) { log.debug( "skipping aggresive-release due to open resources on batcher" ); } else if ( borrowedConnection != null ) { @@ -450,6 +454,26 @@ } } + /** + * Callback to let us know that a flush is beginning. We use this fact + * to temporarily circumvent aggressive connection releasing until after + * the flush cycle is complete {@link #flushEnding()} + */ + public void flushBeginning() { + log.trace( "registering flush begin" ); + isFlushing = true; + } + + /** + * Callback to let us know that a flush is ending. We use this fact to + * stop circumventing aggressive releasing connections. + */ + public void flushEnding() { + log.trace( "registering flush end" ); + isFlushing = false; + afterStatement(); + } + public boolean isReadyForSerialization() { return wasConnectionSupplied ? connection == null : !batcher.hasOpenResources(); } |