cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Francesco Romano <francesco.rom...@abodata.com>
Subject Re: Cayenne shared cache invalidation
Date Wed, 22 Aug 2012 13:12:30 GMT
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
>> 
> 
> 


Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message