:) Thank you very much Francesco
On Aug 22, 2012, at 3:20 PM, Andrus Adamchik wrote: >> 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 >>>> >>> >>> >> > >