diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/FinderCacheImpl.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/FinderCacheImpl.java index 15383c3d4..2970b608c 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/FinderCacheImpl.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/FinderCacheImpl.java @@ -108,8 +108,7 @@ public class FinderCacheImpl return null; } - // FinderCache only operates with Default Fetch Plans - if (!fetch.isDefaultPUFetchGroupConfigurationOnly()) { + if (!fetch.isFetchConfigurationSQLCacheAdmissible()) { return null; } @@ -151,8 +150,7 @@ public class FinderCacheImpl return null; } - // FinderCache only operates with Default Fetch Plans - if (!fetch.isDefaultPUFetchGroupConfigurationOnly()) { + if (!fetch.isFetchConfigurationSQLCacheAdmissible()) { return null; } diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java b/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java index a422597a7..0084ad6a1 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java @@ -77,6 +77,7 @@ public class Compatibility { private boolean _singletonLifecycleEventManager = false; private boolean _filterPCRegistryClasses = false; // OPENJPA-2288 private boolean _returnNullOnEmptyAggregateResult = true; // OPENJPA-1794 + private boolean _cacheNonDefaultFetchPlanQueries = false; // OPENJPA-2414 /** * Whether to require exact identity value types when creating object @@ -763,4 +764,18 @@ public class Compatibility { public void setReturnNullOnAggregateResult(boolean returnNullOnEmptyAggregateResult) { _returnNullOnEmptyAggregateResult = returnNullOnEmptyAggregateResult; } + + /** + * Whether the SQL generated for queries executed with a modified fetch plan are cached. + */ + public boolean getCacheNonDefaultFetchPlanQueries() { + return _cacheNonDefaultFetchPlanQueries; + } + + /** + * Whether the SQL generated for queries executed with a modified fetch plan are cached. + */ + public void setCacheNonDefaultFetchPlanQueries(boolean bool) { + _cacheNonDefaultFetchPlanQueries = bool; + } } diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingFetchConfiguration.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingFetchConfiguration.java index 4a7543259..7edbfca84 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingFetchConfiguration.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingFetchConfiguration.java @@ -595,4 +595,12 @@ public class DelegatingFetchConfiguration throw translate(re); } } + + public boolean isFetchConfigurationSQLCacheAdmissible() { + try { + return _fetch.isFetchConfigurationSQLCacheAdmissible(); + } catch (RuntimeException re) { + throw translate(re); + } + } } diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfiguration.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfiguration.java index 436703a43..72c92bd7b 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfiguration.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfiguration.java @@ -474,4 +474,9 @@ public interface FetchConfiguration * @since 0.4.1 */ public FetchConfiguration traverse(FieldMetaData fm); + + /** + * Whether SQL generated by the FetchConfiguration's current configuration should be cached. + */ + public boolean isFetchConfigurationSQLCacheAdmissible(); } diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java index 0b9e30d99..70c73810c 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java @@ -148,7 +148,8 @@ public class FetchConfigurationImpl public boolean fetchGroupIsPUDefault = false; public boolean extendedPathLookup = false; public DataCacheRetrieveMode cacheRetrieveMode = DataCacheRetrieveMode.USE; - public DataCacheStoreMode cacheStoreMode = DataCacheStoreMode.USE; + public DataCacheStoreMode cacheStoreMode = DataCacheStoreMode.USE; + public boolean cacheNonDefaultFetchPlanQueries = false; } private final ConfigurationState _state; @@ -193,6 +194,8 @@ public class FetchConfigurationImpl addFetchGroups(Arrays.asList(fetchGroupList)); setMaxFetchDepth(conf.getMaxFetchDepth()); + + _state.cacheNonDefaultFetchPlanQueries = conf.getCompatibilityInstance().getCacheNonDefaultFetchPlanQueries(); } /** @@ -201,6 +204,7 @@ public class FetchConfigurationImpl public Object clone() { FetchConfigurationImpl clone = newInstance(null); clone._state.ctx = _state.ctx; + clone._state.cacheNonDefaultFetchPlanQueries = _state.cacheNonDefaultFetchPlanQueries; clone._parent = _parent; clone._fromField = _fromField; clone._fromType = _fromType; @@ -346,7 +350,7 @@ public class FetchConfigurationImpl return addFetchGroup(name, true); } - public FetchConfiguration addFetchGroup(String name, boolean recomputeIsDefault) { + private FetchConfiguration addFetchGroup(String name, boolean recomputeIsDefault) { if (StringUtils.isEmpty(name)) throw new UserException(_loc.get("null-fg")); @@ -383,7 +387,7 @@ public class FetchConfigurationImpl return removeFetchGroup(group, true); } - public FetchConfiguration removeFetchGroup(String group, boolean recomputeIsDefault) { + private FetchConfiguration removeFetchGroup(String group, boolean recomputeIsDefault) { lock(); try { if (_state.fetchGroups != null) { @@ -483,6 +487,15 @@ public class FetchConfigurationImpl return _state.fetchGroupIsPUDefault; } + public boolean isFetchConfigurationSQLCacheAdmissible() { + if (_state == null || _state.cacheNonDefaultFetchPlanQueries) { + return false; + } else { + // Only pctx-default matching FetchConfiguration generated SQL is cache permissible + return _state.fetchGroupIsPUDefault; + } + } + public Set getFields() { if (_state.fields == null) return Collections.emptySet(); return _state.fields; @@ -518,6 +531,7 @@ public class FetchConfigurationImpl _state.fields = new HashSet(); _state.fields.addAll(fields); } finally { + verifyDefaultPUFetchGroups(); unlock(); } return this;