> The problem seems related to the fact that committing the changes regarding
> the newly created object doesn't result in a refresh of the Cayenne cache,
> and so the very same result retrieved for List a is returned also for List
> b.

Correct. There's no good generic algorithm to efficiently detect which cached 
lists should be flushed on commit, so yes, commits have no effect on query 
cache by default.

> Is there any setting or configuration that I need to enable?
> Is there any command that I need to issue in order to invalidate the
> preiovus results of the cache in this example?

I would recommend using "cache groups" to categorize queries - 
query.setCacheGroups("somegroup"). Then you can setup your own cache 
invalidation calling queryCache.removeGroup(..) when certain types of objects 
are committed.

In Cayenne 3.1 we went a step further, and created @CacheGroups annotations and 
CacheInvalidationFilter that allow to do the above declaratively. E.g.:

@CacheGroups("abc")
class Artist extends _Artist {}

The above declaration would ensure that all cached queries that used "abc" 
cache group are flushed when any Artist object is committed.

Andrus


On May 23, 2012, at 8:07 AM, cghersi wrote:
> Hi all,
> 
> I'm trying to use the query cache of Cayenne 3.0.
> 
> My code snippet for the typical query is:
> 
> private List query(Expression qualifier) {
>  DataContext context = config.getDomain("MyDomain").createDataContext();
>  SelectQuery select = new SelectQuery(MyClass.class, qualifier);
>  select.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
>  return context.performQuery(select);
> }
> 
> With this code, if I call my query() method in the following way List b is
> empty:
> Expression qualifier = ... //my filters
> List a = query(qualifier);
> 
> DataContext context = config.getDomain("MyDomain").createDataContext();
> //this is another context with respect to the one used in query()
> MyClass newObj = context.newObject(MyClass .class);
> // set props of newObj
> context.commitChanges();
> 
> List b = query(qualifier); //the same qualifier resulting in List a
> 
> The problem seems related to the fact that committing the changes regarding
> the newly created object doesn't result in a refresh of the Cayenne cache,
> and so the very same result retrieved for List a is returned also for List
> b.
> 
> Is there any setting or configuration that I need to enable?
> Is there any command that I need to issue in order to invalidate the
> preiovus results of the cache in this example?
> 
> Thank you very much
> Best
> cghersi
> 
> 
> 
> --
> View this message in context: 
> http://cayenne.195.n3.nabble.com/Cayenne-cache-strategy-tp4008506.html
> Sent from the Cayenne - User mailing list archive at Nabble.com.
> 

Reply via email to