From 97318b71f0eb22296d46077b0eac527fa454329e Mon Sep 17 00:00:00 2001 From: johara Date: Tue, 16 Aug 2016 16:29:18 +0100 Subject: [PATCH] HHH-11051 : Cache EventListenerRegistry and StatisticsImplementor --- .../hibernate/internal/SessionFactoryImpl.java | 7 ++++++- .../SessionFactoryServiceRegistryImpl.java | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java index ea356b1d13..5c94ca32f6 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java @@ -206,6 +206,8 @@ public final class SessionFactoryImpl implements SessionFactoryImplementor { private final transient SessionFactoryOptions sessionFactoryOptions; private final transient Map cacheAccessStrategiesMap = new HashMap(); + private transient StatisticsImplementor statisticsImplementor; + public SessionFactoryImpl(final MetadataImplementor metadata, SessionFactoryOptions options) { LOG.debug( "Building session factory" ); @@ -1170,7 +1172,10 @@ public final class SessionFactoryImpl implements SessionFactoryImplementor { } public StatisticsImplementor getStatisticsImplementor() { - return serviceRegistry.getService( StatisticsImplementor.class ); + if ( statisticsImplementor == null ) { + statisticsImplementor = serviceRegistry.getService( StatisticsImplementor.class ); + } + return statisticsImplementor; } public FilterDefinition getFilterDefinition(String filterName) throws HibernateException { diff --git a/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryImpl.java b/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryImpl.java index 6a1a166495..e516faa2da 100644 --- a/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryImpl.java @@ -8,7 +8,9 @@ package org.hibernate.service.internal; import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.event.service.spi.EventListenerRegistry; import org.hibernate.service.Service; +import org.hibernate.service.UnknownServiceException; import org.hibernate.service.spi.ServiceBinding; import org.hibernate.service.spi.ServiceInitiator; import org.hibernate.service.spi.ServiceRegistryImplementor; @@ -22,6 +24,7 @@ public class SessionFactoryServiceRegistryImpl extends AbstractServiceRegistryIm private final SessionFactoryOptions sessionFactoryOptions; private final SessionFactoryImplementor sessionFactory; + private EventListenerRegistry cachedEventListenerRegistry; @SuppressWarnings( {"unchecked"}) public SessionFactoryServiceRegistryImpl( @@ -50,4 +53,19 @@ public class SessionFactoryServiceRegistryImpl extends AbstractServiceRegistryIm public void configureService(ServiceBinding serviceBinding) { //TODO nothing to do here or should we inject SessionFactory properties? } + + @Override + public R getService(Class serviceRole) { + + //HHH-11051 cache EventListenerRegistry + if ( serviceRole.equals( EventListenerRegistry.class ) ) { + if ( cachedEventListenerRegistry == null ) { + cachedEventListenerRegistry = (EventListenerRegistry) super.getService( serviceRole ); + } + return (R) cachedEventListenerRegistry; + } + + return super.getService( serviceRole ); + } + }