:)
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
>>>>
>>>
>>>
>>
>
>