HHH-12370 Lazily-initialized byte[] LOB gets turned into a String, resulting in poor performance

This commit is contained in:
Sanne Grinovero 2018-03-07 23:26:40 +00:00
parent 0719c48540
commit 0bc7aecb6c
3 changed files with 7 additions and 44 deletions

View File

@ -27,8 +27,8 @@
* @author Steve Ebersole
*/
public class StandardCacheEntryImpl implements CacheEntry {
private final Serializable[] disassembledState;
private String disassembledStateText;
private final Object version;
private final String subclass;
@ -57,18 +57,12 @@ public StandardCacheEntryImpl(
session,
owner
);
this.disassembledStateText = TypeHelper.toLoggableString(
state,
persister.getPropertyTypes(),
session.getFactory()
);
this.subclass = persister.getEntityName();
this.version = version;
}
StandardCacheEntryImpl(Serializable[] disassembledState, String disassembledStateText, String subclass, Object version) {
StandardCacheEntryImpl(Serializable[] disassembledState, String subclass, Object version) {
this.disassembledState = disassembledState;
this.disassembledStateText = disassembledStateText;
this.subclass = subclass;
this.version = version;
}
@ -144,14 +138,6 @@ public Object[] assemble(
session, instance
);
if ( disassembledStateText == null ) {
disassembledStateText = TypeHelper.toLoggableString(
state,
persister.getPropertyTypes(),
session.getFactory()
);
}
//persister.setIdentifier(instance, id); //before calling interceptor, for consistency with normal load
//TODO: reuse the PreLoadEvent
@ -177,6 +163,7 @@ public Object[] assemble(
@Override
public String toString() {
return "CacheEntry(" + subclass + " {" + disassembledStateText + "})";
return "CacheEntry(" + subclass + ')';
}
}

View File

@ -49,7 +49,6 @@ public Object destructure(Object structured, SessionFactoryImplementor factory)
}
return new StandardCacheEntryImpl(
disassembledState,
null,
subclass,
version
);

View File

@ -6,17 +6,14 @@
*/
package org.hibernate.type;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Map;
import org.hibernate.Hibernate;
import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.property.access.internal.PropertyAccessStrategyBackRefImpl;
import org.hibernate.tuple.NonIdentifierAttribute;
import java.io.Serializable;
import java.util.Map;
/**
* Collection of convenience methods relating to operations across arrays of types...
*
@ -404,24 +401,4 @@ public static int[] findModified(
}
}
public static String toLoggableString(
Object[] state,
Type[] types,
SessionFactoryImplementor factory) {
final StringBuilder buff = new StringBuilder();
for ( int i = 0; i < state.length; i++ ) {
if ( i > 0 ) {
buff.append( ", " );
}
// HHH-11173 - Instead of having to account for unfectched lazy properties in all types, it's done here
if ( state[i] == LazyPropertyInitializer.UNFETCHED_PROPERTY || !Hibernate.isInitialized( state[i] ) ) {
buff.append( "<uninitialized>" );
}
else {
buff.append( types[i].toLoggableString( state[i], factory ) );
}
}
return buff.toString();
}
}