> Is this acceptable (at least .. waiting for our update to cayenne) ?

Yep. See my other message. We both guessed the cause of the issue 
simultaneously :)

Andrus



On Aug 22, 2012, at 4:12 PM, Francesco Romano wrote:

> On Aug 22, 2012, at 3:04 PM, Andrus Adamchik wrote:
> 
>>> Local cache is local to a data context (right?). But currently the 
>>> application creates a new datacontext for every "transaction", so if I 
>>> understood correctly the local cache is useless and I should use the shared 
>>> cache.
>> 
>> Correct.
>> 
>>> I also tried to add a listener (on postPersist, postUpdate and postRemove) 
>>> to clear the cache for that particular group, but it does not work:
>>> 
>>> private void clearCache(Object entity) {
>>>     Persistent object = (Persistent)entity;
>>>     QueryCache cache = 
>>> ((BaseContext)object.getObjectContext()).getQueryCache();
>>>     cache.removeGroup(object.getClass().getName());
>>> }
>> 
>> This is going in the right direction. So is listener method invoked, but the 
>> cache is not cleared, or the listener method is never invoked. 
>> 
>> BTW Cayenne 3.1 has a nice set of extensions called cayenne-lifecycle. The 
>> docs are still sparse (we are working on those), but there is a @CacheGroups 
>> annotation placed on persistent classes that tells Cayenne that any changes 
>> to a given type of objects should generate a cache invalidation event. E.g.:
>> 
>> @CacheGroups("news")
>> public class News extends com.foo.auto._News { }
>> 
>> processing of this annotation is enabled by installing 
>> org.apache.cayenne.lifecycle.cache.CacheInvalidationFilter (also part of 
>> cayenne-lifecycle):
>> 
>> DataChannelFilter filter = new CacheInvalidationFilter();
>> 
>> CayenneRuntime runtime = ...
>> 
>> // a bit clunky.. may merge the following 2 lines in one in the future 
>> releases:
>> runtime.getDataDomain().addFilter(filter);
>> runtime.getDataDomain().getEntityResolver().getCallbackRegistry().addListener(filter);
>> 
>> Cheers,
>> Andrus
>> 
> 
> Thank you for your answer.
> I don't think we can update our cayenne right now, but we will take a look at 
> the annotations asap (it means: when we can spend some time to update 
> cayenne).
> 
> This morning I think I found a solution which seems to work:
> 
> private void clearCache(Object entity) {
>               Persistent object = (Persistent)entity;
>               ObjectContext context = object.getObjectContext();
>               if (context instanceof DataContext) {
>                       DataContext dataContext = (DataContext)context;
>                       QueryCache cache = 
> dataContext.getParentDataDomain().getQueryCache();
>                       cache.removeGroup(object.getClass().getName());
>               }
>       }
> 
> Is this acceptable (at least .. waiting for our update to cayenne) ?
> 
> Regards
> Francesco Romano
> 
>> 
>> On Aug 21, 2012, at 6:36 PM, Francesco Romano wrote:
>>> Hi everybody.
>>> 
>>> I'm trying to add caching support (query cache) to a project which uses 
>>> cayenne.
>>> For what I understood in the online documentation there are two types of 
>>> caches: local and shared.
>>> Local cache is local to a data context (right?). But currently the 
>>> application creates a new datacontext for every "transaction", so if I 
>>> understood correctly the local cache is useless and I should use the shared 
>>> cache.
>>> 
>>> Now... the problem.. I have a query cached (a sort of select * from table) 
>>> and a new row is added in the table. I would like that the next time the 
>>> same query is called also the new row is fetched.
>>> 
>>> This is the query cache
>>> 
>>> SelectQuery select = new SelectQuery(t);
>>> Class t; //this is the class of the persistent object to be fetched         
>>> select.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
>>>             
>>> select.setCacheGroups(t.getName());
>>> 
>>> This is my "sample" test code (Network is a Cayenne Object class) 
>>> (GetAllNetwork is a selectquery with the above caching. AddNetwork adds a 
>>> new object and commit it. A new DataContext is used every time)
>>> 
>>> List<Network> networks = dbHandle.GetAllNetwork();
>>> Network net = dbHandle.AddNetwork();
>>> List<Network> newNetworks = dbHandle.GetAllNetwork();
>>> 
>>> assertEquals(networks.size() + 1, newNetworks.size());
>>> 
>>> 
>>> Now... my assert is not true, because the query is cached.
>>> I also tried to add a listener (on postPersist, postUpdate and postRemove) 
>>> to clear the cache for that particular group, but it does not work:
>>> 
>>> private void clearCache(Object entity) {
>>>     Persistent object = (Persistent)entity;
>>>     QueryCache cache = 
>>> ((BaseContext)object.getObjectContext()).getQueryCache();
>>>     cache.removeGroup(object.getClass().getName());
>>> }
>>> 
>>> Any help?
>>> 
>>> Thanks
>>> Regards
>>> 
>>> Francesco Romano
>>> 
>> 
>> 
> 

Reply via email to