HHH-8945 introduced "hibernate.session.initial_capacity" to reduce
StatefulPersistenceContext's Map#resize calls Conflicts: hibernate-core/src/main/java/org/hibernate/engine/internal/StatefulPersistenceContext.java
This commit is contained in:
parent
8ec3c4a89f
commit
09ea1b33f9
|
@ -710,4 +710,14 @@ public interface AvailableSettings {
|
|||
|
||||
String AUTO_SESSION_EVENTS_LISTENER = "hibernate.session.events.auto";
|
||||
|
||||
/**
|
||||
* A {@link org.hibernate.engine.internal.StatefulPersistenceContext} maintains multiple Maps for a Session. For
|
||||
* performance reasons, it can be desirable to initialize the Maps with a non-default capacity, minimizing the
|
||||
* occurrences of #resize calls. The capacity generally correlates with the quantity of entities expected to be
|
||||
* managed by an average Session.
|
||||
*
|
||||
* Default: 8
|
||||
*/
|
||||
String SESSION_INITIAL_CAPACITY = "hibernate.session.initial_capacity";
|
||||
|
||||
}
|
||||
|
|
|
@ -38,8 +38,6 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
import org.hibernate.AssertionFailure;
|
||||
import org.hibernate.Hibernate;
|
||||
import org.hibernate.HibernateException;
|
||||
|
@ -52,6 +50,7 @@ import org.hibernate.action.spi.AfterTransactionCompletionProcess;
|
|||
import org.hibernate.cache.spi.NaturalIdCacheKey;
|
||||
import org.hibernate.cache.spi.access.NaturalIdRegionAccessStrategy;
|
||||
import org.hibernate.cache.spi.access.SoftLock;
|
||||
import org.hibernate.cfg.AvailableSettings;
|
||||
import org.hibernate.collection.spi.PersistentCollection;
|
||||
import org.hibernate.engine.loading.internal.LoadContexts;
|
||||
import org.hibernate.engine.spi.AssociationKey;
|
||||
|
@ -76,8 +75,10 @@ import org.hibernate.persister.entity.EntityPersister;
|
|||
import org.hibernate.pretty.MessageHelper;
|
||||
import org.hibernate.proxy.HibernateProxy;
|
||||
import org.hibernate.proxy.LazyInitializer;
|
||||
import org.hibernate.service.config.spi.ConfigurationService;
|
||||
import org.hibernate.tuple.ElementWrapper;
|
||||
import org.hibernate.type.CollectionType;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
/**
|
||||
* A <strong>stateful</strong> implementation of the {@link PersistenceContext} contract meaning that we maintain this
|
||||
|
@ -93,11 +94,12 @@ public class StatefulPersistenceContext implements PersistenceContext {
|
|||
|
||||
private static final CoreMessageLogger LOG = Logger.getMessageLogger( CoreMessageLogger.class, StatefulPersistenceContext.class.getName() );
|
||||
|
||||
private static final boolean tracing = LOG.isTraceEnabled();
|
||||
private static final boolean tracing = LOG.isTraceEnabled();
|
||||
|
||||
public static final Object NO_ROW = new MarkerObject( "NO_ROW" );
|
||||
|
||||
public static final int INIT_COLL_SIZE = 8;
|
||||
private static final int DEFAULT_INITIAL_CAPACITY = 8;
|
||||
private final int initialCapacity;
|
||||
|
||||
private SessionImplementor session;
|
||||
|
||||
|
@ -163,19 +165,22 @@ public class StatefulPersistenceContext implements PersistenceContext {
|
|||
public StatefulPersistenceContext(SessionImplementor session) {
|
||||
this.session = session;
|
||||
|
||||
entitiesByKey = new HashMap<EntityKey, Object>( INIT_COLL_SIZE );
|
||||
entitiesByUniqueKey = new HashMap<EntityUniqueKey, Object>( INIT_COLL_SIZE );
|
||||
initialCapacity = session.getFactory().getServiceRegistry().getService( ConfigurationService.class )
|
||||
.getSetting( AvailableSettings.SESSION_INITIAL_CAPACITY, Integer.class, DEFAULT_INITIAL_CAPACITY );
|
||||
|
||||
entitiesByKey = new HashMap<EntityKey, Object>( initialCapacity );
|
||||
entitiesByUniqueKey = new HashMap<EntityUniqueKey, Object>( initialCapacity );
|
||||
//noinspection unchecked
|
||||
proxiesByKey = new ConcurrentReferenceHashMap<EntityKey, Object>( INIT_COLL_SIZE, .75f, 1, ConcurrentReferenceHashMap.ReferenceType.STRONG, ConcurrentReferenceHashMap.ReferenceType.WEAK, null );
|
||||
entitySnapshotsByKey = new HashMap<EntityKey, Object>( INIT_COLL_SIZE );
|
||||
proxiesByKey = new ConcurrentReferenceHashMap<EntityKey, Object>( initialCapacity, .75f, 1, ConcurrentReferenceHashMap.ReferenceType.STRONG, ConcurrentReferenceHashMap.ReferenceType.WEAK, null );
|
||||
entitySnapshotsByKey = new HashMap<EntityKey, Object>( initialCapacity );
|
||||
|
||||
entityEntryContext = new EntityEntryContext();
|
||||
// entityEntries = IdentityMap.instantiateSequenced( INIT_COLL_SIZE );
|
||||
collectionEntries = IdentityMap.instantiateSequenced( INIT_COLL_SIZE );
|
||||
parentsByChild = new IdentityHashMap<Object,Object>( INIT_COLL_SIZE );
|
||||
// entityEntries = IdentityMap.instantiateSequenced( initialCapacity );
|
||||
collectionEntries = IdentityMap.instantiateSequenced( initialCapacity );
|
||||
parentsByChild = new IdentityHashMap<Object,Object>( initialCapacity );
|
||||
|
||||
collectionsByKey = new HashMap<CollectionKey, PersistentCollection>( INIT_COLL_SIZE );
|
||||
arrayHolders = new IdentityHashMap<Object, PersistentCollection>( INIT_COLL_SIZE );
|
||||
collectionsByKey = new HashMap<CollectionKey, PersistentCollection>( initialCapacity );
|
||||
arrayHolders = new IdentityHashMap<Object, PersistentCollection>( initialCapacity );
|
||||
|
||||
nullifiableEntityKeys = new HashSet<EntityKey>();
|
||||
|
||||
|
@ -183,8 +188,8 @@ public class StatefulPersistenceContext implements PersistenceContext {
|
|||
}
|
||||
|
||||
private void initTransientState() {
|
||||
nullAssociations = new HashSet<AssociationKey>( INIT_COLL_SIZE );
|
||||
nonlazyCollections = new ArrayList<PersistentCollection>( INIT_COLL_SIZE );
|
||||
nullAssociations = new HashSet<AssociationKey>( initialCapacity );
|
||||
nonlazyCollections = new ArrayList<PersistentCollection>( initialCapacity );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -208,7 +213,7 @@ public class StatefulPersistenceContext implements PersistenceContext {
|
|||
@Override
|
||||
public void addUnownedCollection(CollectionKey key, PersistentCollection collection) {
|
||||
if (unownedCollections==null) {
|
||||
unownedCollections = new HashMap<CollectionKey,PersistentCollection>(INIT_COLL_SIZE);
|
||||
unownedCollections = new HashMap<CollectionKey,PersistentCollection>(initialCapacity);
|
||||
}
|
||||
unownedCollections.put( key, collection );
|
||||
}
|
||||
|
@ -1660,6 +1665,9 @@ public class StatefulPersistenceContext implements PersistenceContext {
|
|||
final StatefulPersistenceContext rtn = new StatefulPersistenceContext( session );
|
||||
SessionFactoryImplementor sfi = session.getFactory();
|
||||
|
||||
int initialCapacity = sfi.getServiceRegistry().getService( ConfigurationService.class )
|
||||
.getSetting( AvailableSettings.SESSION_INITIAL_CAPACITY, Integer.class, DEFAULT_INITIAL_CAPACITY );
|
||||
|
||||
// during deserialization, we need to reconnect all proxies and
|
||||
// collections to this session, as well as the EntityEntry and
|
||||
// CollectionEntry instances; these associations are transient
|
||||
|
@ -1672,14 +1680,14 @@ public class StatefulPersistenceContext implements PersistenceContext {
|
|||
|
||||
int count = ois.readInt();
|
||||
if ( tracing ) LOG.trace("Starting deserialization of [" + count + "] entitiesByKey entries");
|
||||
rtn.entitiesByKey = new HashMap<EntityKey,Object>( count < INIT_COLL_SIZE ? INIT_COLL_SIZE : count );
|
||||
rtn.entitiesByKey = new HashMap<EntityKey,Object>( count < initialCapacity ? initialCapacity : count );
|
||||
for ( int i = 0; i < count; i++ ) {
|
||||
rtn.entitiesByKey.put( EntityKey.deserialize( ois, sfi ), ois.readObject() );
|
||||
}
|
||||
|
||||
count = ois.readInt();
|
||||
if ( tracing ) LOG.trace("Starting deserialization of [" + count + "] entitiesByUniqueKey entries");
|
||||
rtn.entitiesByUniqueKey = new HashMap<EntityUniqueKey,Object>( count < INIT_COLL_SIZE ? INIT_COLL_SIZE : count );
|
||||
rtn.entitiesByUniqueKey = new HashMap<EntityUniqueKey,Object>( count < initialCapacity ? initialCapacity : count );
|
||||
for ( int i = 0; i < count; i++ ) {
|
||||
rtn.entitiesByUniqueKey.put( EntityUniqueKey.deserialize( ois, session ), ois.readObject() );
|
||||
}
|
||||
|
@ -1688,7 +1696,7 @@ public class StatefulPersistenceContext implements PersistenceContext {
|
|||
if ( tracing ) LOG.trace("Starting deserialization of [" + count + "] proxiesByKey entries");
|
||||
//noinspection unchecked
|
||||
rtn.proxiesByKey = new ConcurrentReferenceHashMap<EntityKey, Object>(
|
||||
count < INIT_COLL_SIZE ? INIT_COLL_SIZE : count,
|
||||
count < initialCapacity ? initialCapacity : count,
|
||||
.75f,
|
||||
1,
|
||||
ConcurrentReferenceHashMap.ReferenceType.STRONG,
|
||||
|
@ -1709,7 +1717,7 @@ public class StatefulPersistenceContext implements PersistenceContext {
|
|||
|
||||
count = ois.readInt();
|
||||
if ( tracing ) LOG.trace("Starting deserialization of [" + count + "] entitySnapshotsByKey entries");
|
||||
rtn.entitySnapshotsByKey = new HashMap<EntityKey,Object>( count < INIT_COLL_SIZE ? INIT_COLL_SIZE : count );
|
||||
rtn.entitySnapshotsByKey = new HashMap<EntityKey,Object>( count < initialCapacity ? initialCapacity : count );
|
||||
for ( int i = 0; i < count; i++ ) {
|
||||
rtn.entitySnapshotsByKey.put( EntityKey.deserialize( ois, sfi ), ois.readObject() );
|
||||
}
|
||||
|
@ -1717,7 +1725,7 @@ public class StatefulPersistenceContext implements PersistenceContext {
|
|||
rtn.entityEntryContext = EntityEntryContext.deserialize( ois, rtn );
|
||||
// count = ois.readInt();
|
||||
// if ( tracing ) LOG.trace("Starting deserialization of [" + count + "] entityEntries entries");
|
||||
// rtn.entityEntries = IdentityMap.instantiateSequenced( count < INIT_COLL_SIZE ? INIT_COLL_SIZE : count );
|
||||
// rtn.entityEntries = IdentityMap.instantiateSequenced( count < initialCapacity ? initialCapacity : count );
|
||||
// for ( int i = 0; i < count; i++ ) {
|
||||
// Object entity = ois.readObject();
|
||||
// EntityEntry entry = EntityEntry.deserialize( ois, rtn );
|
||||
|
@ -1726,14 +1734,14 @@ public class StatefulPersistenceContext implements PersistenceContext {
|
|||
|
||||
count = ois.readInt();
|
||||
if ( tracing ) LOG.trace("Starting deserialization of [" + count + "] collectionsByKey entries");
|
||||
rtn.collectionsByKey = new HashMap<CollectionKey,PersistentCollection>( count < INIT_COLL_SIZE ? INIT_COLL_SIZE : count );
|
||||
rtn.collectionsByKey = new HashMap<CollectionKey,PersistentCollection>( count < initialCapacity ? initialCapacity : count );
|
||||
for ( int i = 0; i < count; i++ ) {
|
||||
rtn.collectionsByKey.put( CollectionKey.deserialize( ois, session ), (PersistentCollection) ois.readObject() );
|
||||
}
|
||||
|
||||
count = ois.readInt();
|
||||
if ( tracing ) LOG.trace("Starting deserialization of [" + count + "] collectionEntries entries");
|
||||
rtn.collectionEntries = IdentityMap.instantiateSequenced( count < INIT_COLL_SIZE ? INIT_COLL_SIZE : count );
|
||||
rtn.collectionEntries = IdentityMap.instantiateSequenced( count < initialCapacity ? initialCapacity : count );
|
||||
for ( int i = 0; i < count; i++ ) {
|
||||
final PersistentCollection pc = ( PersistentCollection ) ois.readObject();
|
||||
final CollectionEntry ce = CollectionEntry.deserialize( ois, session );
|
||||
|
@ -1743,7 +1751,7 @@ public class StatefulPersistenceContext implements PersistenceContext {
|
|||
|
||||
count = ois.readInt();
|
||||
if ( tracing ) LOG.trace("Starting deserialization of [" + count + "] arrayHolders entries");
|
||||
rtn.arrayHolders = new IdentityHashMap<Object, PersistentCollection>( count < INIT_COLL_SIZE ? INIT_COLL_SIZE : count );
|
||||
rtn.arrayHolders = new IdentityHashMap<Object, PersistentCollection>( count < initialCapacity ? initialCapacity : count );
|
||||
for ( int i = 0; i < count; i++ ) {
|
||||
rtn.arrayHolders.put( ois.readObject(), (PersistentCollection) ois.readObject() );
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue