HHH-13587 Allocate StatefulPersistenceContext#naturalIdXrefDelegate lazily

This commit is contained in:
Sanne Grinovero 2019-08-17 15:58:36 +01:00 committed by Sanne Grinovero
parent aae670b9b3
commit 0538b97d6a
1 changed files with 18 additions and 12 deletions

View File

@ -262,7 +262,7 @@ public class StatefulPersistenceContext implements PersistenceContext {
if ( loadContexts != null ) { if ( loadContexts != null ) {
loadContexts.cleanup(); loadContexts.cleanup();
} }
naturalIdXrefDelegate.clear(); naturalIdXrefDelegate = null;
} }
@Override @Override
@ -1762,11 +1762,16 @@ public class StatefulPersistenceContext implements PersistenceContext {
} }
} }
// NATURAL ID RESOLUTION HANDLING ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // NATURAL ID RESOLUTION HANDLING ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
private final NaturalIdXrefDelegate naturalIdXrefDelegate = new NaturalIdXrefDelegate( this ); private NaturalIdXrefDelegate naturalIdXrefDelegate;
private NaturalIdXrefDelegate getNaturalIdXrefDelegate() {
if ( naturalIdXrefDelegate == null ) {
this.naturalIdXrefDelegate = new NaturalIdXrefDelegate( this );
}
return naturalIdXrefDelegate;
}
private final NaturalIdHelper naturalIdHelper = new NaturalIdHelper() { private final NaturalIdHelper naturalIdHelper = new NaturalIdHelper() {
@Override @Override
@ -1785,7 +1790,7 @@ public class StatefulPersistenceContext implements PersistenceContext {
// from a single load event. The first put journal would come from the natural id resolution; // from a single load event. The first put journal would come from the natural id resolution;
// the second comes from the entity loading. In this condition, we want to avoid the multiple // the second comes from the entity loading. In this condition, we want to avoid the multiple
// 'put' stats incrementing. // 'put' stats incrementing.
final boolean justAddedLocally = naturalIdXrefDelegate.cacheNaturalIdCrossReference( persister, id, naturalIdValues ); final boolean justAddedLocally = getNaturalIdXrefDelegate().cacheNaturalIdCrossReference( persister, id, naturalIdValues );
if ( justAddedLocally && persister.hasNaturalIdCache() ) { if ( justAddedLocally && persister.hasNaturalIdCache() ) {
managedSharedCacheEntries( persister, id, naturalIdValues, null, CachedNaturalIdValueSource.LOAD ); managedSharedCacheEntries( persister, id, naturalIdValues, null, CachedNaturalIdValueSource.LOAD );
@ -1808,7 +1813,7 @@ public class StatefulPersistenceContext implements PersistenceContext {
final Object[] naturalIdValues = extractNaturalIdValues( state, persister ); final Object[] naturalIdValues = extractNaturalIdValues( state, persister );
// cache // cache
naturalIdXrefDelegate.cacheNaturalIdCrossReference( persister, id, naturalIdValues ); getNaturalIdXrefDelegate().cacheNaturalIdCrossReference( persister, id, naturalIdValues );
} }
@Override @Override
@ -1965,7 +1970,7 @@ public class StatefulPersistenceContext implements PersistenceContext {
persister = locateProperPersister( persister ); persister = locateProperPersister( persister );
final Object[] naturalIdValues = getNaturalIdValues( state, persister ); final Object[] naturalIdValues = getNaturalIdValues( state, persister );
final Object[] localNaturalIdValues = naturalIdXrefDelegate.removeNaturalIdCrossReference( final Object[] localNaturalIdValues = getNaturalIdXrefDelegate().removeNaturalIdCrossReference(
persister, persister,
id, id,
naturalIdValues naturalIdValues
@ -2004,12 +2009,12 @@ public class StatefulPersistenceContext implements PersistenceContext {
@Override @Override
public Object[] findCachedNaturalId(EntityPersister persister, Serializable pk) { public Object[] findCachedNaturalId(EntityPersister persister, Serializable pk) {
return naturalIdXrefDelegate.findCachedNaturalId( locateProperPersister( persister ), pk ); return getNaturalIdXrefDelegate().findCachedNaturalId( locateProperPersister( persister ), pk );
} }
@Override @Override
public Serializable findCachedNaturalIdResolution(EntityPersister persister, Object[] naturalIdValues) { public Serializable findCachedNaturalIdResolution(EntityPersister persister, Object[] naturalIdValues) {
return naturalIdXrefDelegate.findCachedNaturalIdResolution( locateProperPersister( persister ), naturalIdValues ); return getNaturalIdXrefDelegate().findCachedNaturalIdResolution( locateProperPersister( persister ), naturalIdValues );
} }
@Override @Override
@ -2047,7 +2052,7 @@ public class StatefulPersistenceContext implements PersistenceContext {
@Override @Override
public Collection<Serializable> getCachedPkResolutions(EntityPersister entityPersister) { public Collection<Serializable> getCachedPkResolutions(EntityPersister entityPersister) {
return naturalIdXrefDelegate.getCachedPkResolutions( entityPersister ); return getNaturalIdXrefDelegate().getCachedPkResolutions( entityPersister );
} }
@Override @Override
@ -2060,6 +2065,7 @@ public class StatefulPersistenceContext implements PersistenceContext {
persister = locateProperPersister( persister ); persister = locateProperPersister( persister );
final Object[] naturalIdValuesFromCurrentObjectState = extractNaturalIdValues( entity, persister ); final Object[] naturalIdValuesFromCurrentObjectState = extractNaturalIdValues( entity, persister );
final NaturalIdXrefDelegate naturalIdXrefDelegate = getNaturalIdXrefDelegate();
final boolean changed = ! naturalIdXrefDelegate.sameAsCached( final boolean changed = ! naturalIdXrefDelegate.sameAsCached(
persister, persister,
pk, pk,
@ -2081,12 +2087,12 @@ public class StatefulPersistenceContext implements PersistenceContext {
@Override @Override
public void cleanupFromSynchronizations() { public void cleanupFromSynchronizations() {
naturalIdXrefDelegate.unStashInvalidNaturalIdReferences(); getNaturalIdXrefDelegate().unStashInvalidNaturalIdReferences();
} }
@Override @Override
public void handleEviction(Object object, EntityPersister persister, Serializable identifier) { public void handleEviction(Object object, EntityPersister persister, Serializable identifier) {
naturalIdXrefDelegate.removeNaturalIdCrossReference( getNaturalIdXrefDelegate().removeNaturalIdCrossReference(
persister, persister,
identifier, identifier,
findCachedNaturalId( persister, identifier ) findCachedNaturalId( persister, identifier )