HHH-9010: Revert "HHH-8961 Reduce allocation cost of org.hibernate.cache.spi.CacheKey instances"
This reverts commit 539866b773
.
This commit is contained in:
parent
d25044a1ea
commit
9f927ba3ac
|
@ -1,54 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* Copyright (c) 2014, Red Hat Inc. or third-party contributors as
|
|
||||||
* indicated by the @author tags or express copyright attribution
|
|
||||||
* statements applied by the authors. All third-party contributions are
|
|
||||||
* distributed under license by Red Hat Inc.
|
|
||||||
*
|
|
||||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
|
||||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
|
||||||
* Lesser General Public License, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
||||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
|
||||||
* for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with this distribution; if not, write to:
|
|
||||||
* Free Software Foundation, Inc.
|
|
||||||
* 51 Franklin Street, Fifth Floor
|
|
||||||
* Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
package org.hibernate.cache.internal;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
import org.hibernate.cache.spi.CacheKey;
|
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
|
||||||
import org.hibernate.type.Type;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Variation of CacheKey to be used when multi-tenancy is applied.
|
|
||||||
* The tenantId field was not simply added to the superclass because of performance considerations:
|
|
||||||
* CacheKey instances are have a very high allocation frequency and this field would enlarge the
|
|
||||||
* size by 50%.
|
|
||||||
*
|
|
||||||
* @author Sanne Grinovero
|
|
||||||
*/
|
|
||||||
public class TenantAwareCacheKey extends CacheKey {
|
|
||||||
|
|
||||||
private final String tenantId;
|
|
||||||
|
|
||||||
public TenantAwareCacheKey(Serializable id, Type type, String entityOrRoleName, SessionFactoryImplementor factory, String tenantId) {
|
|
||||||
super( id, type, entityOrRoleName, factory, tenantId );
|
|
||||||
this.tenantId = tenantId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTenantId() {
|
|
||||||
return tenantId;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -33,20 +33,14 @@ import org.hibernate.type.Type;
|
||||||
* Allows multiple entity classes / collection roles to be stored in the same cache region. Also allows for composite
|
* Allows multiple entity classes / collection roles to be stored in the same cache region. Also allows for composite
|
||||||
* keys which do not properly implement equals()/hashCode().
|
* keys which do not properly implement equals()/hashCode().
|
||||||
*
|
*
|
||||||
* Note on performance: this class is allocated very heavily!
|
|
||||||
* Make sure the allocation cost stays as low as possible:
|
|
||||||
* if you need to add fields for not-so-common use cases,
|
|
||||||
* it's probably better to create an ad-hoc implementation
|
|
||||||
* extending this one.
|
|
||||||
*
|
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
* @author Sanne Grinovero
|
|
||||||
*/
|
*/
|
||||||
public class CacheKey implements Serializable {
|
public class CacheKey implements Serializable {
|
||||||
|
|
||||||
private final Serializable key;
|
private final Serializable key;
|
||||||
private final Type type;
|
private final Type type;
|
||||||
|
private final String entityOrRoleName;
|
||||||
|
private final String tenantId;
|
||||||
private final int hashCode;
|
private final int hashCode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -64,25 +58,16 @@ public class CacheKey implements Serializable {
|
||||||
final Serializable id,
|
final Serializable id,
|
||||||
final Type type,
|
final Type type,
|
||||||
final String entityOrRoleName,
|
final String entityOrRoleName,
|
||||||
|
final String tenantId,
|
||||||
final SessionFactoryImplementor factory) {
|
final SessionFactoryImplementor factory) {
|
||||||
this( id, type, entityOrRoleName, factory, null );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used by subclasses: need to specify a tenantId
|
|
||||||
*/
|
|
||||||
protected CacheKey(
|
|
||||||
final Serializable id,
|
|
||||||
final Type type,
|
|
||||||
final String entityOrRoleName,
|
|
||||||
final SessionFactoryImplementor factory,
|
|
||||||
final String tenantId) {
|
|
||||||
this.key = id;
|
this.key = id;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.hashCode = calculateHashCode( type, factory, tenantId );
|
this.entityOrRoleName = entityOrRoleName;
|
||||||
|
this.tenantId = tenantId;
|
||||||
|
this.hashCode = calculateHashCode( type, factory );
|
||||||
}
|
}
|
||||||
|
|
||||||
private int calculateHashCode(Type type, SessionFactoryImplementor factory, String tenantId) {
|
private int calculateHashCode(Type type, SessionFactoryImplementor factory) {
|
||||||
int result = type.getHashCode( key, factory );
|
int result = type.getHashCode( key, factory );
|
||||||
result = 31 * result + (tenantId != null ? tenantId.hashCode() : 0);
|
result = 31 * result + (tenantId != null ? tenantId.hashCode() : 0);
|
||||||
return result;
|
return result;
|
||||||
|
@ -92,8 +77,12 @@ public class CacheKey implements Serializable {
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getEntityOrRoleName() {
|
||||||
|
return entityOrRoleName;
|
||||||
|
}
|
||||||
|
|
||||||
public String getTenantId() {
|
public String getTenantId() {
|
||||||
return null;
|
return tenantId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -108,10 +97,10 @@ public class CacheKey implements Serializable {
|
||||||
//hashCode is part of this check since it is pre-calculated and hash must match for equals to be true
|
//hashCode is part of this check since it is pre-calculated and hash must match for equals to be true
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//Warning: this equals implementation needs to work correctly also for the subclass
|
|
||||||
final CacheKey that = (CacheKey) other;
|
final CacheKey that = (CacheKey) other;
|
||||||
return EqualsHelper.equals( getTenantId(), that.getTenantId() )
|
return EqualsHelper.equals( entityOrRoleName, that.entityOrRoleName )
|
||||||
&& type.isEqual( key, that.key );
|
&& type.isEqual( key, that.key )
|
||||||
|
&& EqualsHelper.equals( tenantId, that.tenantId );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -119,4 +108,9 @@ public class CacheKey implements Serializable {
|
||||||
return hashCode;
|
return hashCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
// Used to be required for OSCache
|
||||||
|
return entityOrRoleName + '#' + key.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,6 @@ import org.hibernate.ScrollableResults;
|
||||||
import org.hibernate.SessionEventListener;
|
import org.hibernate.SessionEventListener;
|
||||||
import org.hibernate.SessionException;
|
import org.hibernate.SessionException;
|
||||||
import org.hibernate.SharedSessionContract;
|
import org.hibernate.SharedSessionContract;
|
||||||
import org.hibernate.cache.internal.TenantAwareCacheKey;
|
|
||||||
import org.hibernate.cache.spi.CacheKey;
|
import org.hibernate.cache.spi.CacheKey;
|
||||||
import org.hibernate.engine.jdbc.LobCreationContext;
|
import org.hibernate.engine.jdbc.LobCreationContext;
|
||||||
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
|
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
|
||||||
|
@ -330,13 +329,7 @@ public abstract class AbstractSessionImpl
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CacheKey generateCacheKey(Serializable id, Type type, String entityOrRoleName) {
|
public CacheKey generateCacheKey(Serializable id, Type type, String entityOrRoleName) {
|
||||||
final String tenantIdentifier = getTenantIdentifier();
|
return new CacheKey( id, type, entityOrRoleName, getTenantIdentifier(), getFactory() );
|
||||||
if ( tenantIdentifier == null ) {
|
|
||||||
return new CacheKey( id, type, entityOrRoleName, getFactory() );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return new TenantAwareCacheKey( id, type, entityOrRoleName, getFactory(), tenantIdentifier );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private transient JdbcConnectionAccess jdbcConnectionAccess;
|
private transient JdbcConnectionAccess jdbcConnectionAccess;
|
||||||
|
|
|
@ -119,11 +119,11 @@ public class CacheImpl implements CacheImplementor {
|
||||||
}
|
}
|
||||||
|
|
||||||
private CacheKey buildCacheKey(Serializable identifier, EntityPersister p) {
|
private CacheKey buildCacheKey(Serializable identifier, EntityPersister p) {
|
||||||
// have to assume non tenancy
|
|
||||||
return new CacheKey(
|
return new CacheKey(
|
||||||
identifier,
|
identifier,
|
||||||
p.getIdentifierType(),
|
p.getIdentifierType(),
|
||||||
p.getRootEntityName(),
|
p.getRootEntityName(),
|
||||||
|
null, // have to assume non tenancy
|
||||||
sessionFactory
|
sessionFactory
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -197,11 +197,11 @@ public class CacheImpl implements CacheImplementor {
|
||||||
}
|
}
|
||||||
|
|
||||||
private CacheKey buildCacheKey(Serializable ownerIdentifier, CollectionPersister p) {
|
private CacheKey buildCacheKey(Serializable ownerIdentifier, CollectionPersister p) {
|
||||||
// have to assume non tenancy
|
|
||||||
return new CacheKey(
|
return new CacheKey(
|
||||||
ownerIdentifier,
|
ownerIdentifier,
|
||||||
p.getKeyType(),
|
p.getKeyType(),
|
||||||
p.getRole(),
|
p.getRole(),
|
||||||
|
null, // have to assume non tenancy
|
||||||
sessionFactory
|
sessionFactory
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue