Grokbase Groups Cayenne user May 2012
FAQ
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.

Search Discussions

  • Andrus Adamchik at May 23, 2012 at 1:02 pm

    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.

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupuser @
categoriescayenne
postedMay 23, '12 at 12:08p
activeMay 23, '12 at 1:02p
posts2
users2
websitecayenne.apache.org

2 users in discussion

Andrus Adamchik: 1 post Cghersi: 1 post

People

Translate

site design / logo © 2022 Grokbase