⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 actionqueue.java

📁 一个Java持久层类库
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * Hibernate, Relational Persistence for Idiomatic Java * * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors.  All third-party contributions are * distributed under license by Red Hat Middleware LLC. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA  02110-1301  USA * */package org.hibernate.engine;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.LinkedList;import java.util.List;import java.util.Set;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.hibernate.AssertionFailure;import org.hibernate.HibernateException;import org.hibernate.action.BulkOperationCleanupAction;import org.hibernate.action.CollectionRecreateAction;import org.hibernate.action.CollectionRemoveAction;import org.hibernate.action.CollectionUpdateAction;import org.hibernate.action.EntityDeleteAction;import org.hibernate.action.EntityIdentityInsertAction;import org.hibernate.action.EntityInsertAction;import org.hibernate.action.EntityUpdateAction;import org.hibernate.action.Executable;import org.hibernate.cache.CacheException;import org.hibernate.type.Type;/** * Responsible for maintaining the queue of actions related to events. * </p> * The ActionQueue holds the DML operations queued as part of a session's * transactional-write-behind semantics.  DML operations are queued here * until a flush forces them to be executed against the database. * * @author Steve Ebersole */public class ActionQueue {	private static final Logger log = LoggerFactory.getLogger( ActionQueue.class );	private static final int INIT_QUEUE_LIST_SIZE = 5;	private SessionImplementor session;	// Object insertions, updates, and deletions have list semantics because	// they must happen in the right order so as to respect referential	// integrity	private ArrayList insertions;	private ArrayList deletions;	private ArrayList updates;	// Actually the semantics of the next three are really "Bag"	// Note that, unlike objects, collection insertions, updates,	// deletions are not really remembered between flushes. We	// just re-use the same Lists for convenience.	private ArrayList collectionCreations;	private ArrayList collectionUpdates;	private ArrayList collectionRemovals;	private ArrayList executions;	/**	 * Constructs an action queue bound to the given session.	 *	 * @param session The session "owning" this queue.	 */	public ActionQueue(SessionImplementor session) {		this.session = session;		init();	}	private void init() {		insertions = new ArrayList( INIT_QUEUE_LIST_SIZE );		deletions = new ArrayList( INIT_QUEUE_LIST_SIZE );		updates = new ArrayList( INIT_QUEUE_LIST_SIZE );		collectionCreations = new ArrayList( INIT_QUEUE_LIST_SIZE );		collectionRemovals = new ArrayList( INIT_QUEUE_LIST_SIZE );		collectionUpdates = new ArrayList( INIT_QUEUE_LIST_SIZE );		executions = new ArrayList( INIT_QUEUE_LIST_SIZE * 3 );	}	public void clear() {		updates.clear();		insertions.clear();		deletions.clear();		collectionCreations.clear();		collectionRemovals.clear();		collectionUpdates.clear();	}	public void addAction(EntityInsertAction action) {		insertions.add( action );	}	public void addAction(EntityDeleteAction action) {		deletions.add( action );	}	public void addAction(EntityUpdateAction action) {		updates.add( action );	}	public void addAction(CollectionRecreateAction action) {		collectionCreations.add( action );	}	public void addAction(CollectionRemoveAction action) {		collectionRemovals.add( action );	}	public void addAction(CollectionUpdateAction action) {		collectionUpdates.add( action );	}	public void addAction(EntityIdentityInsertAction insert) {		insertions.add( insert );	}	public void addAction(BulkOperationCleanupAction cleanupAction) {		// Add these directly to the executions queue		executions.add( cleanupAction );	}	/**	 * Perform all currently queued entity-insertion actions.	 *	 * @throws HibernateException error executing queued insertion actions.	 */	public void executeInserts() throws HibernateException {		executeActions( insertions );	}	/**	 * Perform all currently queued actions.	 *	 * @throws HibernateException error executing queued actions.	 */	public void executeActions() throws HibernateException {		executeActions( insertions );		executeActions( updates );		executeActions( collectionRemovals );		executeActions( collectionUpdates );		executeActions( collectionCreations );		executeActions( deletions );	}	/**	 * Prepares the internal action queues for execution.	 *	 * @throws HibernateException error preparing actions.	 */	public void prepareActions() throws HibernateException {		prepareActions( collectionRemovals );		prepareActions( collectionUpdates );		prepareActions( collectionCreations );	}	/**	 * Performs cleanup of any held cache softlocks.	 *	 * @param success Was the transaction successful.	 */	public void afterTransactionCompletion(boolean success) {		int size = executions.size();		final boolean invalidateQueryCache = session.getFactory().getSettings().isQueryCacheEnabled();		for ( int i = 0; i < size; i++ ) {			try {				Executable exec = ( Executable ) executions.get( i );				try {					exec.afterTransactionCompletion( success );				}				finally {					if ( invalidateQueryCache ) {						session.getFactory().getUpdateTimestampsCache().invalidate( exec.getPropertySpaces() );					}				}			}			catch ( CacheException ce ) {				log.error( "could not release a cache lock", ce );				// continue loop			}			catch ( Exception e ) {				throw new AssertionFailure( "Exception releasing cache locks", e );			}		}		executions.clear();	}	/**	 * Check whether the given tables/query-spaces are to be executed against	 * given the currently queued actions.	 *	 * @param tables The table/query-spaces to check.	 *	 * @return True if we contain pending actions against any of the given	 *         tables; false otherwise.	 */	public boolean areTablesToBeUpdated(Set tables) {		return areTablesToUpdated( updates, tables ) ||				areTablesToUpdated( insertions, tables ) ||				areTablesToUpdated( deletions, tables ) ||				areTablesToUpdated( collectionUpdates, tables ) ||				areTablesToUpdated( collectionCreations, tables ) ||				areTablesToUpdated( collectionRemovals, tables );	}	/**	 * Check whether any insertion or deletion actions are currently queued.	 *	 * @return True if insertions or deletions are currently queued; false otherwise.	 */	public boolean areInsertionsOrDeletionsQueued() {		return ( insertions.size() > 0 || deletions.size() > 0 );	}	private static boolean areTablesToUpdated(List executables, Set tablespaces) {		int size = executables.size();		for ( int j = 0; j < size; j++ ) {			Serializable[] spaces = ( ( Executable ) executables.get( j ) ).getPropertySpaces();			for ( int i = 0; i < spaces.length; i++ ) {				if ( tablespaces.contains( spaces[i] ) ) {					if ( log.isDebugEnabled() ) {						log.debug( "changes must be flushed to space: " + spaces[i] );					}					return true;				}			}		}		return false;	}	private void executeActions(List list) throws HibernateException {		int size = list.size();		for ( int i = 0; i < size; i++ ) {			execute( ( Executable ) list.get( i ) );		}		list.clear();		session.getBatcher().executeBatch();	}	public void execute(Executable executable) {		final boolean lockQueryCache = session.getFactory().getSettings().isQueryCacheEnabled();		if ( executable.hasAfterTransactionCompletion() || lockQueryCache ) {			executions.add( executable );		}		if ( lockQueryCache ) {			session.getFactory()					.getUpdateTimestampsCache()					.preinvalidate( executable.getPropertySpaces() );		}		executable.execute();	}	private void prepareActions(List queue) throws HibernateException {		int size = queue.size();		for ( int i = 0; i < size; i++ ) {			Executable executable = ( Executable ) queue.get( i );			executable.beforeExecutions();		}	}	/**	 * Returns a string representation of the object.	 *	 * @return a string representation of the object.	 */	public String toString() {		return new StringBuffer()				.append( "ActionQueue[insertions=" ).append( insertions )				.append( " updates=" ).append( updates )				.append( " deletions=" ).append( deletions )				.append( " collectionCreations=" ).append( collectionCreations )				.append( " collectionRemovals=" ).append( collectionRemovals )				.append( " collectionUpdates=" ).append( collectionUpdates )				.append( "]" )				.toString();	}	public int numberOfCollectionRemovals() {		return collectionRemovals.size();	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -