Revise PartTree query caching.

See #3588
Original pull request: #3653
This commit is contained in:
Mark Paluch
2024-11-21 10:44:50 +01:00
parent 39e776cb6e
commit ded2a63497
3 changed files with 12 additions and 16 deletions

View File

@@ -450,7 +450,7 @@ public final class JpqlQueryBuilder {
/**
* Select a single attribute.
*
* @param name
* @param path
* @return
*/
default Select select(JpqlQueryBuilder.PathExpression path) {

View File

@@ -279,12 +279,8 @@ public class PartTreeJpaQuery extends AbstractJpaQuery {
protected JpqlQueryCreator createCreator(Sort sort, JpaParametersParameterAccessor accessor) {
JpqlQueryCreator jpqlQueryCreator;
synchronized (cache) {
jpqlQueryCreator = cache.get(sort, accessor); // this caching thingy is broken due to IS NULL rendering for
// simple properties
}
JpqlQueryCreator jpqlQueryCreator = cache.get(sort, accessor); // this caching thingy is broken due to IS NULL
// rendering for
if (jpqlQueryCreator != null) {
return jpqlQueryCreator;
}
@@ -307,9 +303,7 @@ public class PartTreeJpaQuery extends AbstractJpaQuery {
return creator;
}
synchronized (cache) {
cache.put(sort, accessor, creator);
}
cache.put(sort, accessor, creator);
return creator;
}
@@ -377,13 +371,12 @@ public class PartTreeJpaQuery extends AbstractJpaQuery {
*/
private class CountQueryPreparer extends QueryPreparer {
private volatile JpqlQueryCreator cached;
private final PartTreeQueryCache cache = new PartTreeQueryCache();
@Override
protected JpqlQueryCreator createCreator(Sort sort, JpaParametersParameterAccessor accessor) {
JpqlQueryCreator cached = this.cached;
JpqlQueryCreator cached = cache.get(Sort.unsorted(), accessor);
if (cached != null) {
return cached;
}
@@ -393,7 +386,9 @@ public class PartTreeJpaQuery extends AbstractJpaQuery {
getQueryMethod().getResultProcessor().getReturnedType(), provider, templates, em);
if (!accessor.getParameters().hasDynamicProjection()) {
return this.cached = new CacheableJpqlCountQueryCreator(creator);
cached = new CacheableJpqlCountQueryCreator(creator);
cache.put(Sort.unsorted(), accessor, cached);
return cached;
}
return creator;

View File

@@ -16,6 +16,7 @@
package org.springframework.data.jpa.repository.query;
import java.util.BitSet;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
@@ -31,12 +32,12 @@ import org.springframework.util.ObjectUtils;
*/
class PartTreeQueryCache {
private final Map<CacheKey, JpqlQueryCreator> cache = new LinkedHashMap<>() {
private final Map<CacheKey, JpqlQueryCreator> cache = Collections.synchronizedMap(new LinkedHashMap<>() {
@Override
protected boolean removeEldestEntry(Map.Entry<CacheKey, JpqlQueryCreator> eldest) {
return size() > 256;
}
};
});
@Nullable
JpqlQueryCreator get(Sort sort, JpaParametersParameterAccessor accessor) {