Skip to content

Commit eb41718

Browse files
committed
Revise PartTree query caching.
See #3588 Original pull request: #3653
1 parent a32eeb8 commit eb41718

File tree

2 files changed

+11
-15
lines changed

2 files changed

+11
-15
lines changed

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/PartTreeJpaQuery.java

+8-13
Original file line numberDiff line numberDiff line change
@@ -279,12 +279,8 @@ private Query restrictMaxResultsIfNecessary(Query query, @Nullable ScrollPositio
279279

280280
protected JpqlQueryCreator createCreator(Sort sort, JpaParametersParameterAccessor accessor) {
281281

282-
JpqlQueryCreator jpqlQueryCreator;
283-
synchronized (cache) {
284-
jpqlQueryCreator = cache.get(sort, accessor); // this caching thingy is broken due to IS NULL rendering for
285-
// simple properties
286-
}
287-
282+
JpqlQueryCreator jpqlQueryCreator = cache.get(sort, accessor); // this caching thingy is broken due to IS NULL
283+
// rendering for
288284
if (jpqlQueryCreator != null) {
289285
return jpqlQueryCreator;
290286
}
@@ -307,9 +303,7 @@ protected JpqlQueryCreator createCreator(Sort sort, JpaParametersParameterAccess
307303
return creator;
308304
}
309305

310-
synchronized (cache) {
311-
cache.put(sort, accessor, creator);
312-
}
306+
cache.put(sort, accessor, creator);
313307

314308
return creator;
315309
}
@@ -377,13 +371,12 @@ private Sort getDynamicSort(JpaParametersParameterAccessor accessor) {
377371
*/
378372
private class CountQueryPreparer extends QueryPreparer {
379373

380-
private volatile JpqlQueryCreator cached;
374+
private final PartTreeQueryCache cache = new PartTreeQueryCache();
381375

382376
@Override
383377
protected JpqlQueryCreator createCreator(Sort sort, JpaParametersParameterAccessor accessor) {
384378

385-
JpqlQueryCreator cached = this.cached;
386-
379+
JpqlQueryCreator cached = cache.get(Sort.unsorted(), accessor);
387380
if (cached != null) {
388381
return cached;
389382
}
@@ -393,7 +386,9 @@ protected JpqlQueryCreator createCreator(Sort sort, JpaParametersParameterAccess
393386
getQueryMethod().getResultProcessor().getReturnedType(), provider, templates, em);
394387

395388
if (!accessor.getParameters().hasDynamicProjection()) {
396-
return this.cached = new CacheableJpqlCountQueryCreator(creator);
389+
cached = new CacheableJpqlCountQueryCreator(creator);
390+
cache.put(Sort.unsorted(), accessor, cached);
391+
return cached;
397392
}
398393

399394
return creator;

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/PartTreeQueryCache.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.springframework.data.jpa.repository.query;
1717

1818
import java.util.BitSet;
19+
import java.util.Collections;
1920
import java.util.LinkedHashMap;
2021
import java.util.Map;
2122
import java.util.Objects;
@@ -31,12 +32,12 @@
3132
*/
3233
class PartTreeQueryCache {
3334

34-
private final Map<CacheKey, JpqlQueryCreator> cache = new LinkedHashMap<>() {
35+
private final Map<CacheKey, JpqlQueryCreator> cache = Collections.synchronizedMap(new LinkedHashMap<>() {
3536
@Override
3637
protected boolean removeEldestEntry(Map.Entry<CacheKey, JpqlQueryCreator> eldest) {
3738
return size() > 256;
3839
}
39-
};
40+
});
4041

4142
@Nullable
4243
JpqlQueryCreator get(Sort sort, JpaParametersParameterAccessor accessor) {

0 commit comments

Comments
 (0)