second example enable cache hibernate jpa ehcache

example - spring boot hibernate cache



Ineficiente rendimiento EhCache (1)

Versión recursiva Trabajo completo

Clase org.hibernate.type.AbstractType

public int getHashCode(Object x) { if (x instanceof Object[]){ int result = 1; for (Object element : (Object[]) x) result = 31 * result + (element == null ? 0 : getHashCode(element)); return result; } return x.hashCode(); }

Y

public static boolean arraysEquals(Object[] a, Object[] a2) { if (a==a2) return true; if (a==null || a2==null) return false; int length = a.length; if (a2.length != length) return false; for (int i=0; i<length; i++) { Object o1 = a[i]; Object o2 = a2[i]; if (o1==null){ if (o2!=null) return false; }else{ if (o2==null) return false; if (o1 instanceof Object[]){ if (!(o2 instanceof Object[])) return false; else if (!arraysEquals( (Object[]) o1, (Object[]) o2)) return false; }else if (!o1.equals(o2)) return false; } } return true; } public static boolean equals(final Object x, final Object y) { if (x!=null && x instanceof Object[] && y!=null && y instanceof Object[] ) return arraysEquals((Object[])x, (Object[])y); return x == y || ( x != null && y != null && x.equals( y ) ); }

Usando esas propiedades JPA

props.put( "hibernate.cache.use_query_cache", "true" ); props.put( "hibernate.cache.use_second_level_cache", "true" ); props.put("hibernate.temp.use_jdbc_metadata_defaults", "false"); props.put( "hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory" ); props.put( "javax.persistence.sharedCache.mode", SharedCacheMode.ALL );

Ehcache no es eficiente para la misma consulta,

El problema está relacionado con la función namedParameters.hashCode () de la clase QueryCache, ¡genera un HashCode diferente para la misma consulta!

private int generateHashCode() { int result = 13; result = 37 * result + ( firstRow==null ? 0 : firstRow.hashCode() ); result = 37 * result + ( maxRows==null ? 0 : maxRows.hashCode() ); for ( int i=0; i< positionalParameterValues.length; i++ ) { result = 37 * result + ( positionalParameterValues[i]==null ? 0 : positionalParameterTypes[i].getHashCode( positionalParameterValues[i] ) ); } result = 37 * result + ( namedParameters==null ? 0 : namedParameters.hashCode() ); result = 37 * result + ( filterKeys ==null ? 0 : filterKeys.hashCode() ); result = 37 * result + ( customTransformer==null ? 0 : customTransformer.hashCode() ); result = 37 * result + ( tenantIdentifier==null ? 0 : tenantIdentifier.hashCode() ); result = 37 * result + sqlQueryString.hashCode(); return result; }

que está relacionado con la clase

org.hibernate.type.AbstractType public int getHashCode(Object x) { return x.hashCode(); }

¡genera un hachCode (nuevo) diferente para el mismo objeto Array [01, 1]!

Este método hashCode debe ser recursivo para matrices