Hi John, I think I understand where you are going with this feature. As we discussed before, sometimes keeping a context cache as a transparent region of the main cache is undesirable, e.g. for memory management reasons. But I have some questions about the implementation committed to "master":
1. The commit seems incomplete - sometimes we use the new "getLocalQueryCache()", sometimes - the old "getQueryCache()". 2. Having both "queryCache" and "localQueryCache" as ivars of BaseContext may be confusing. What do you think of moving cache type selection logic in ObjectContextFactory? Thanks, Andrus > On Jul 1, 2019, at 5:53 PM, johnth...@apache.org wrote: > > This is an automated email from the ASF dual-hosted git repository. > > johnthuss pushed a commit to branch master > in repository https://gitbox.apache.org/repos/asf/cayenne.git > > > The following commit(s) were added to refs/heads/master by this push: > new 597376a CAY-2589 Allow optionally using a local query cache that is > separate from the shared query cache. > 597376a is described below > > commit 597376ae558b9a0c5ddc4390da188b9530204e3d > Author: John Huss <johnth...@apache.org> > AuthorDate: Mon Jun 3 16:57:20 2019 -0500 > > CAY-2589 Allow optionally using a local query cache that is separate from > the shared query cache. > > The local query cache can be customized by creating a custom > DataContextFactory. > > A separate cache can prevent memory leaks from occurring if you used > non-expiring cache > groups (like the default cache group perhaps) along with the local cache, > which wasn't > intuitive if you expected the lifetime of the cache to match the lifetime > of the ObjectContext. > --- > RELEASE-NOTES.txt | 1 + > .../main/java/org/apache/cayenne/BaseContext.java | 27 +++++++++++++++++++++- > .../cayenne/util/ObjectContextQueryAction.java | 9 +++++++- > 3 files changed, 35 insertions(+), 2 deletions(-) > > diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt > index 6f45986..3aa2fa8 100644 > --- a/RELEASE-NOTES.txt > +++ b/RELEASE-NOTES.txt > @@ -36,6 +36,7 @@ CAY-2569 Custom 'Naming Strategy' in Cayenne Modeler > CAY-2570 Use MySQL adapter for latest versions of MariaDB > CAY-2579 Review and possibly relax usage of readonly flag of ObjRelationship > CAY-2585 Rename scalarQuery and params methods in SQLSelect > +CAY-2589 - Allow optionally using a local query cache that is separate from > the shared query cache. > > Bug Fixes: > > diff --git a/cayenne-server/src/main/java/org/apache/cayenne/BaseContext.java > b/cayenne-server/src/main/java/org/apache/cayenne/BaseContext.java > index 981db73..ffae953 100644 > --- a/cayenne-server/src/main/java/org/apache/cayenne/BaseContext.java > +++ b/cayenne-server/src/main/java/org/apache/cayenne/BaseContext.java > @@ -98,6 +98,7 @@ public abstract class BaseContext implements ObjectContext { > // registry > protected transient DataChannel channel; > protected transient QueryCache queryCache; > + protected transient QueryCache localQueryCache; > protected transient EntityResolver entityResolver; > > protected boolean validatingObjectsOnCommit = true; > @@ -469,17 +470,41 @@ public abstract class BaseContext implements > ObjectContext { > @Override > public abstract Collection<?> uncommittedObjects(); > > + /** > + * Used for storing cached query results available to all > ObjectContexts. > + */ > public QueryCache getQueryCache() { > attachToRuntimeIfNeeded(); > return queryCache; > } > > /** > - * Sets a QueryCache to be used for storing cached query results. > + * Sets a QueryCache to be used for storing cached query results > available to all ObjectContexts. > */ > public void setQueryCache(QueryCache queryCache) { > this.queryCache = queryCache; > } > + > + /** > + * Used for storing cached query results available only to this > ObjectContext. > + * By default the local query cache and the shared query cache will use > the same underlying storage. > + * > + * @since 4.2 > + */ > + public QueryCache getLocalQueryCache() { > + attachToRuntimeIfNeeded(); > + return localQueryCache != null ? localQueryCache : > getQueryCache(); > + } > + > + /** > + * Sets a QueryCache to be used for storing cached query results > available only to this ObjectContext. > + * By default the local query cache and the shared query cache will use > the same underlying storage. > + * > + * @since 4.2 > + */ > + public void setLocalQueryCache(QueryCache queryCache) { > + this.localQueryCache = queryCache; > + } > > /** > * Returns EventManager associated with the ObjectStore. > diff --git > a/cayenne-server/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java > > b/cayenne-server/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java > index 75dbdfa..acef54e 100644 > --- > a/cayenne-server/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java > +++ > b/cayenne-server/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java > @@ -360,7 +360,7 @@ public abstract class ObjectContextQueryAction { > return !DONE; > } > > - QueryCache queryCache = getQueryCache(); > + QueryCache queryCache = getLocalQueryCache(); > QueryCacheEntryFactory factory = getCacheObjectFactory(); > > if (cache) { > @@ -385,6 +385,13 @@ public abstract class ObjectContextQueryAction { > protected QueryCache getQueryCache() { > return ((BaseContext) actingContext).getQueryCache(); > } > + > + /** > + * @since 4.2 > + */ > + protected QueryCache getLocalQueryCache() { > + return ((BaseContext) actingContext).getLocalQueryCache(); > + } > > /** > * @since 3.0 >