HHH-5824 - Poor multithread performance in SessionFactoryImpl.getQueryCache method
This commit is contained in:
parent
144dde0080
commit
ddbeaf5625
|
@ -38,6 +38,8 @@ import java.util.LinkedHashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.ConcurrentMap;
|
||||||
import javax.naming.NamingException;
|
import javax.naming.NamingException;
|
||||||
import javax.naming.Reference;
|
import javax.naming.Reference;
|
||||||
import javax.naming.StringRefAddr;
|
import javax.naming.StringRefAddr;
|
||||||
|
@ -176,8 +178,8 @@ public final class SessionFactoryImpl implements SessionFactory, SessionFactoryI
|
||||||
private final transient TransactionManager transactionManager;
|
private final transient TransactionManager transactionManager;
|
||||||
private final transient QueryCache queryCache;
|
private final transient QueryCache queryCache;
|
||||||
private final transient UpdateTimestampsCache updateTimestampsCache;
|
private final transient UpdateTimestampsCache updateTimestampsCache;
|
||||||
private final transient Map queryCaches;
|
private final transient Map<String,QueryCache> queryCaches;
|
||||||
private final transient Map allCacheRegions = new HashMap();
|
private final transient ConcurrentMap<String,Region> allCacheRegions = new ConcurrentHashMap<String, Region>();
|
||||||
private final transient Statistics statistics;
|
private final transient Statistics statistics;
|
||||||
private final transient EventListeners eventListeners;
|
private final transient EventListeners eventListeners;
|
||||||
private final transient CurrentSessionContext currentSessionContext;
|
private final transient CurrentSessionContext currentSessionContext;
|
||||||
|
@ -391,7 +393,7 @@ public final class SessionFactoryImpl implements SessionFactory, SessionFactoryI
|
||||||
updateTimestampsCache = new UpdateTimestampsCache(settings, properties);
|
updateTimestampsCache = new UpdateTimestampsCache(settings, properties);
|
||||||
queryCache = settings.getQueryCacheFactory()
|
queryCache = settings.getQueryCacheFactory()
|
||||||
.getQueryCache(null, updateTimestampsCache, settings, properties);
|
.getQueryCache(null, updateTimestampsCache, settings, properties);
|
||||||
queryCaches = new HashMap();
|
queryCaches = new HashMap<String,QueryCache>();
|
||||||
allCacheRegions.put( updateTimestampsCache.getRegion().getName(), updateTimestampsCache.getRegion() );
|
allCacheRegions.put( updateTimestampsCache.getRegion().getName(), updateTimestampsCache.getRegion() );
|
||||||
allCacheRegions.put( queryCache.getRegion().getName(), queryCache.getRegion() );
|
allCacheRegions.put( queryCache.getRegion().getName(), queryCache.getRegion() );
|
||||||
}
|
}
|
||||||
|
@ -1069,26 +1071,20 @@ public final class SessionFactoryImpl implements SessionFactory, SessionFactoryI
|
||||||
public void evictQueryRegion(String regionName) {
|
public void evictQueryRegion(String regionName) {
|
||||||
if (regionName == null) throw new NullPointerException(
|
if (regionName == null) throw new NullPointerException(
|
||||||
"Region-name cannot be null (use Cache#evictDefaultQueryRegion to evict the default query cache)");
|
"Region-name cannot be null (use Cache#evictDefaultQueryRegion to evict the default query cache)");
|
||||||
synchronized (allCacheRegions) {
|
|
||||||
if (settings.isQueryCacheEnabled()) {
|
if (settings.isQueryCacheEnabled()) {
|
||||||
QueryCache namedQueryCache = (QueryCache)queryCaches.get(regionName);
|
QueryCache namedQueryCache = queryCaches.get(regionName);
|
||||||
// TODO : cleanup entries in queryCaches + allCacheRegions ?
|
// TODO : cleanup entries in queryCaches + allCacheRegions ?
|
||||||
if (namedQueryCache != null) namedQueryCache.clear();
|
if (namedQueryCache != null) namedQueryCache.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public void evictQueryRegions() {
|
public void evictQueryRegions() {
|
||||||
synchronized ( allCacheRegions ) {
|
for ( QueryCache queryCache : queryCaches.values() ) {
|
||||||
Iterator regions = queryCaches.values().iterator();
|
queryCache.clear();
|
||||||
while ( regions.hasNext() ) {
|
|
||||||
QueryCache cache = ( QueryCache ) regions.next();
|
|
||||||
cache.clear();
|
|
||||||
// TODO : cleanup entries in queryCaches + allCacheRegions ?
|
// TODO : cleanup entries in queryCaches + allCacheRegions ?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public Cache getCache() {
|
public Cache getCache() {
|
||||||
return cacheAccess;
|
return cacheAccess;
|
||||||
|
@ -1145,28 +1141,23 @@ public final class SessionFactoryImpl implements SessionFactory, SessionFactoryI
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized ( allCacheRegions ) {
|
QueryCache currentQueryCache = queryCaches.get( regionName );
|
||||||
QueryCache currentQueryCache = ( QueryCache ) queryCaches.get( regionName );
|
|
||||||
if ( currentQueryCache == null ) {
|
if ( currentQueryCache == null ) {
|
||||||
currentQueryCache = settings.getQueryCacheFactory().getQueryCache( regionName, updateTimestampsCache, settings, properties );
|
currentQueryCache = settings.getQueryCacheFactory().getQueryCache( regionName, updateTimestampsCache, settings, properties );
|
||||||
queryCaches.put( regionName, currentQueryCache );
|
queryCaches.put( regionName, currentQueryCache );
|
||||||
allCacheRegions.put( currentQueryCache.getRegion().getName(), currentQueryCache.getRegion() );
|
allCacheRegions.put( currentQueryCache.getRegion().getName(), currentQueryCache.getRegion() );
|
||||||
}
|
}
|
||||||
|
|
||||||
return currentQueryCache;
|
return currentQueryCache;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public Region getSecondLevelCacheRegion(String regionName) {
|
public Region getSecondLevelCacheRegion(String regionName) {
|
||||||
synchronized ( allCacheRegions ) {
|
return allCacheRegions.get( regionName );
|
||||||
return ( Region ) allCacheRegions.get( regionName );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map getAllSecondLevelCacheRegions() {
|
public Map getAllSecondLevelCacheRegions() {
|
||||||
synchronized ( allCacheRegions ) {
|
|
||||||
return new HashMap( allCacheRegions );
|
return new HashMap( allCacheRegions );
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isClosed() {
|
public boolean isClosed() {
|
||||||
return isClosed;
|
return isClosed;
|
||||||
|
|
Loading…
Reference in New Issue