Skip to content

Commit a761705

Browse files
stuartwdouglasSanne
authored andcommitted
HHH-10302 Cache the LoadEvent and PostLoadEvent to reduce allocations
1 parent 6777977 commit a761705

File tree

3 files changed

+82
-14
lines changed

3 files changed

+82
-14
lines changed

hibernate-core/src/main/java/org/hibernate/event/internal/DefaultLoadEventListener.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ protected Object loadFromSecondLevelCache(
615615
}
616616
else {
617617
entity = convertCacheReferenceEntryToEntity( (ReferenceCacheEntryImpl) entry,
618-
event.getEntityId(), persister, event.getSession(), entityKey );
618+
event.getEntityId(), persister, event.getSession(), entityKey, event );
619619
}
620620
}
621621
else {
@@ -638,7 +638,8 @@ private Object convertCacheReferenceEntryToEntity(
638638
Serializable entityId,
639639
EntityPersister persister,
640640
EventSource session,
641-
EntityKey entityKey) {
641+
EntityKey entityKey,
642+
LoadEvent loadEvent) {
642643
final Object entity = referenceCacheEntry.getReference();
643644

644645
if ( entity == null ) {
@@ -651,15 +652,15 @@ private Object convertCacheReferenceEntryToEntity(
651652
EventListenerGroup<PostLoadEventListener> evenListenerGroup = getEvenListenerGroup(session);
652653

653654
if(!evenListenerGroup.isEmpty()) {
654-
postLoad(session, evenListenerGroup.listeners(), entity, entityId, persister);
655+
postLoad(session, evenListenerGroup.listeners(), entity, entityId, persister, loadEvent);
655656
}
656657
return entity;
657658
}
658659
}
659660

660661
private void postLoad(EventSource session, Iterable<PostLoadEventListener> listeners,
661-
Object entity, Serializable entityId, EntityPersister persister) {
662-
PostLoadEvent postLoadEvent = new PostLoadEvent(session)
662+
Object entity, Serializable entityId, EntityPersister persister, LoadEvent event) {
663+
PostLoadEvent postLoadEvent = event.getPostLoadEvent()
663664
.setEntity(entity)
664665
.setId(entityId)
665666
.setPersister(persister);
@@ -788,7 +789,7 @@ private Object convertCacheEntryToEntity(
788789
persistenceContext.initializeNonLazyCollections();
789790

790791
//PostLoad is needed for EJB3
791-
PostLoadEvent postLoadEvent = new PostLoadEvent( session )
792+
PostLoadEvent postLoadEvent = event.getPostLoadEvent()
792793
.setEntity( entity )
793794
.setId( entityId )
794795
.setPersister( persister );
@@ -885,7 +886,7 @@ private Object assembleCacheEntry(
885886

886887
//PostLoad is needed for EJB3
887888
//TODO: reuse the PostLoadEvent...
888-
PostLoadEvent postLoadEvent = new PostLoadEvent( session )
889+
PostLoadEvent postLoadEvent = event.getPostLoadEvent()
889890
.setEntity( result )
890891
.setId( id )
891892
.setPersister( persister );

hibernate-core/src/main/java/org/hibernate/event/spi/LoadEvent.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public LockOptions setScope(boolean scope) {
4545
private LockOptions lockOptions;
4646
private boolean isAssociationFetch;
4747
private Object result;
48+
private PostLoadEvent postLoadEvent;
4849

4950
public LoadEvent(Serializable entityId, Object instanceToLoad, EventSource source) {
5051
this( entityId, null, instanceToLoad, DEFAULT_LOCK_OPTIONS, false, source );
@@ -104,6 +105,7 @@ else if ( lockOptions.getLockMode() == null ) {
104105
this.instanceToLoad = instanceToLoad;
105106
this.lockOptions = lockOptions;
106107
this.isAssociationFetch = isAssociationFetch;
108+
this.postLoadEvent = new PostLoadEvent(source);
107109
}
108110

109111
public Serializable getEntityId() {
@@ -180,4 +182,12 @@ public Object getResult() {
180182
public void setResult(Object result) {
181183
this.result = result;
182184
}
185+
186+
public PostLoadEvent getPostLoadEvent() {
187+
return postLoadEvent;
188+
}
189+
190+
public void setPostLoadEvent(PostLoadEvent postLoadEvent) {
191+
this.postLoadEvent = postLoadEvent;
192+
}
183193
}

hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java

Lines changed: 64 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ public final class SessionImpl extends AbstractSessionImpl implements EventSourc
205205
private transient ExceptionMapper exceptionMapper;
206206
private transient ManagedFlushChecker managedFlushChecker;
207207
private transient AfterCompletionAction afterCompletionAction;
208+
private transient LoadEvent loadEvent; //cached LoadEvent instance
208209

209210
/**
210211
* Constructor used for openSession(...) processing, as well as construction
@@ -936,8 +937,26 @@ private void fireDelete(DeleteEvent event, Set transientEntities) {
936937

937938
@Override
938939
public void load(Object object, Serializable id) throws HibernateException {
939-
LoadEvent event = new LoadEvent( id, object, this );
940+
LoadEvent event = loadEvent;
941+
loadEvent = null;
942+
if(event == null) {
943+
event = new LoadEvent( id, object, this );
944+
} else {
945+
event.setEntityClassName(null);
946+
event.setEntityId(id);
947+
event.setInstanceToLoad(object);
948+
event.setLockMode(LoadEvent.DEFAULT_LOCK_MODE);
949+
event.setLockScope(LoadEvent.DEFAULT_LOCK_OPTIONS.getScope());
950+
event.setLockTimeout(LoadEvent.DEFAULT_LOCK_OPTIONS.getTimeOut());
951+
}
940952
fireLoad( event, LoadEventListener.RELOAD );
953+
if(loadEvent == null) {
954+
event.setEntityClassName(null);
955+
event.setEntityId(null);
956+
event.setInstanceToLoad(null);
957+
event.setResult(null);
958+
loadEvent = event;
959+
}
941960
}
942961

943962
@Override
@@ -971,10 +990,28 @@ public Object immediateLoad(String entityName, Serializable id) throws Hibernate
971990
EntityPersister persister = getFactory().getEntityPersister( entityName );
972991
LOG.debugf( "Initializing proxy: %s", MessageHelper.infoString( persister, id, getFactory() ) );
973992
}
974-
975-
LoadEvent event = new LoadEvent( id, entityName, true, this );
993+
LoadEvent event = loadEvent;
994+
loadEvent = null;
995+
if(event == null) {
996+
event = new LoadEvent( id, entityName, true, this );
997+
} else {
998+
event.setEntityClassName(entityName);
999+
event.setEntityId(id);
1000+
event.setInstanceToLoad(null);
1001+
event.setLockMode(LoadEvent.DEFAULT_LOCK_MODE);
1002+
event.setLockScope(LoadEvent.DEFAULT_LOCK_OPTIONS.getScope());
1003+
event.setLockTimeout(LoadEvent.DEFAULT_LOCK_OPTIONS.getTimeOut());
1004+
}
9761005
fireLoad( event, LoadEventListener.IMMEDIATE_LOAD );
977-
return event.getResult();
1006+
Object result = event.getResult();
1007+
if(loadEvent == null) {
1008+
event.setEntityClassName(null);
1009+
event.setEntityId(null);
1010+
event.setInstanceToLoad(null);
1011+
event.setResult(null);
1012+
loadEvent = event;
1013+
}
1014+
return result;
9781015
}
9791016

9801017
@Override
@@ -986,12 +1023,32 @@ public Object internalLoad(String entityName, Serializable id, boolean eager, bo
9861023
: eager
9871024
? LoadEventListener.INTERNAL_LOAD_EAGER
9881025
: LoadEventListener.INTERNAL_LOAD_LAZY;
989-
LoadEvent event = new LoadEvent( id, entityName, true, this );
1026+
1027+
LoadEvent event = loadEvent;
1028+
loadEvent = null;
1029+
if(event == null) {
1030+
event = new LoadEvent( id, entityName, true, this );
1031+
} else {
1032+
event.setEntityClassName(entityName);
1033+
event.setEntityId(id);
1034+
event.setInstanceToLoad(null);
1035+
event.setLockMode(LoadEvent.DEFAULT_LOCK_MODE);
1036+
event.setLockScope(LoadEvent.DEFAULT_LOCK_OPTIONS.getScope());
1037+
event.setLockTimeout(LoadEvent.DEFAULT_LOCK_OPTIONS.getTimeOut());
1038+
}
9901039
fireLoad( event, type );
1040+
Object result = event.getResult();
9911041
if ( !nullable ) {
992-
UnresolvableObjectException.throwIfNull( event.getResult(), id, entityName );
1042+
UnresolvableObjectException.throwIfNull(result, id, entityName );
9931043
}
994-
return event.getResult();
1044+
if(loadEvent == null) {
1045+
event.setEntityClassName(null);
1046+
event.setEntityId(null);
1047+
event.setInstanceToLoad(null);
1048+
event.setResult(null);
1049+
loadEvent = event;
1050+
}
1051+
return result;
9951052
}
9961053

9971054
@Override

0 commit comments

Comments
 (0)