> I think I'm beginning to understand. The annotation, along with the > CacheInvalidationFilter, is to flush a particular cache group when changes > are committed to the annotated object.
Yes, exactly. > Is there some documentation for 3.1 or 4.0 for these annotations and query > caching? The latest I can find is the 3.0 documentation. There's a hole in the docs, but we essentially already discussed all details. To recap: 1. Use "setCacheGroups" on your queries to associate queries with particular groups. (Caveat with EhCache provider: when setting more than one cache group per query, only the first one takes effect. The rest are ignored). 2. Configure the default expiration policies for those groups in ehcache.xml 3. (Optionally) use @CacheGroups / CacheInvalidationFilter to force cache groups expiration when certain entities are committed. 4. (Optionally) build a UI for manual cache group invalidation. 5. (Optionally) broadcast cache group expiration events sent explicitly or by CacheInvalidationFilter across the cluster. Items #1 and #2 are the minimal required setup to take advantage of caching. Items 3-5 are optional, but give you more control over the cache and can improve its "accuracy". (Hmm, why don't I copy the above to our docs :)) Andrus > On Feb 4, 2016, at 12:24 AM, Frank Herrmann > <[email protected]> wrote: > > I think I'm beginning to understand. The annotation, along with the > CacheInvalidationFilter, is to flush a particular cache group when changes > are committed to the annotated object. > > Is there some documentation for 3.1 or 4.0 for these annotations and query > caching? The latest I can find is the 3.0 documentation. > > Thanks again, > -Frank > > On Wed, Feb 3, 2016 at 3:57 PM, Frank Herrmann < > [email protected]> wrote: > >> Is the annotation used for the Object Cache then and not the Query Cache? >> >> On Wed, Feb 3, 2016 at 3:10 PM, Frank Herrmann < >> [email protected]> wrote: >> >>> So, is the CacheGroups annotation used by the query cache at all? If I >>> have to set the cache group via code, then what purpose does the annotation >>> serve? >>> >>> Thanks for the clarification. >>> >>> -Frank >>> >>> On Wed, Feb 3, 2016 at 3:08 PM, Andrus Adamchik <[email protected]> >>> wrote: >>> >>>> Ah, I think this is relevant: >>>> >>>>>>>>> If I specify the cache group in the code, i.e. >>>>>>>>> query.setCacheGroups(), everything works fine, and the cache group >>>> is >>>>>>>>> utilized. >>>> >>>> This is needed. This is how Cayenne knows which cache group a query is >>>> associated with. >>>> >>>> Andrus >>>> >>>> >>>> >>>> >>>>> On Feb 3, 2016, at 11:04 PM, Frank Herrmann < >>>> [email protected]> wrote: >>>>> >>>>> Sure. It takes a few hops to get there but here it is. >>>>> >>>>> The actual search is done in our CayenneGenericDao class. The type >>>>> parameter in this method is the StatusFirm class. >>>>> >>>>> public <T> List<T> find(Class<T> type, SearchContext searchContext) >>>>>> { >>>>>> DataContext dataContext = getObjectContext(); >>>>>> if >>>> (FlushMode.ALWAYS.equals(DataContextUtils.getFlushMode(dataContext)) || >>>>>> FlushMode.AUTO.equals(DataContextUtils.getFlushMode(dataContext))) >>>>>> flush(); >>>>>> Query query = getQuery(type, searchContext); >>>>>> if (!validateContext(searchContext, query)) >>>>>> return new ArrayList<T>(0); >>>>>> >>>>>> if(type != null) >>>>>> flushIfNecessary(type, dataContext); >>>>>> List<T> results = null; >>>>>> if(query instanceof SelectQuery) >>>>>> results = (List<T>) doFind((SelectQuery)query, searchContext); >>>>>> >>>>>> else if(query instanceof SQLTemplate) >>>>>> results = (List<T>) doFind((SQLTemplate)query, searchContext, type == >>>>>> null); >>>>>> else >>>>>> throw new IllegalArgumentException("Query type not supported " + >>>>>> query.getClass()); >>>>>> >>>>>> if(type != null && Persistent.class.isAssignableFrom(type)) >>>>>> CayenneObjectUtils.addFreshLoaded(dataContext, (List<? extends >>>>>> Persistent>)results); >>>>>> return results; >>>>>> } >>>>> >>>>> >>>>> Here is the getQuery method. At the point where >>>> query.setCacheStrategy() is >>>>> call, the strategy is "CACHE", and it is being cached, just to the >>>> default >>>>> cache group. >>>>> >>>>> private Query getQuery(Class<?> type, SearchContext searchContext) >>>>>> { >>>>>> if (searchContext == null) >>>>>> return new SelectQuery(type); >>>>>> >>>>>> Object path = searchContext.getPath(); >>>>>> Map<String, ?> params = searchContext.getParameters(); >>>>>> if (params == null) >>>>>> params = Collections.emptyMap(); >>>>>> if (path != null) >>>>>> { >>>>>> Query query = resolveQuery(path); >>>>>> if(query instanceof ParameterizedQuery) >>>>>> { >>>>>> query = ((ParameterizedQuery)query).createQuery(params); >>>>>> } >>>>>> return query; >>>>>> } >>>>>> SelectQuery query = new SelectQuery(type); >>>>>> Object oCriteria = searchContext.getCriteria(); >>>>>> if (oCriteria instanceof List<?>) >>>>>> { >>>>>> List<?> criteria = (List<?>) searchContext.getCriteria(); >>>>>> query.andQualifier(buildQualifiers(criteria, params)); >>>>>> } >>>>>> else if (oCriteria instanceof Expression) >>>>>> { >>>>>> query.andQualifier((Expression) oCriteria); >>>>>> } >>>>>> else if (oCriteria instanceof Criterion) >>>>>> { >>>>>> query.andQualifier(cayenneCriteriaAdaptor.adapt((Criterion) oCriteria, >>>>>> params)); >>>>>> } >>>>>> else if (oCriteria != null) >>>>>> throw new IllegalArgumentException("Criteria type not supported " + >>>>>> oCriteria.getClass().getName()); >>>>>> if (searchContext.getCacheStrategy() != null) { >>>>>> >>>>>> >>>> query.setCacheStrategy(cacheStrategies.get(searchContext.getCacheStrategy())); >>>>>> } >>>>>> return query; >>>>>> } >>>>> >>>>> >>>>> >>>>> Thanks Andrus. >>>>> >>>>> On Wed, Feb 3, 2016 at 2:14 PM, Andrus Adamchik < >>>> [email protected]> >>>>> wrote: >>>>> >>>>>> Do you have an example of SelectQuery fetching StatusFirms? >>>>>> >>>>>> Andrus >>>>>> >>>>>>> On Feb 3, 2016, at 10:12 PM, Frank Herrmann < >>>>>> [email protected]> wrote: >>>>>>> >>>>>>> Hi Andrus, >>>>>>> >>>>>>> Thanks for the quick reply. However, adding the filter didn't seem to >>>>>> work. >>>>>>> Below is my addition of the filter to our runtime. >>>>>>> >>>>>>> public synchronized static void initialize(String cayenneConfig) >>>>>>>> { >>>>>>>> if(cayenneRuntime != null) { >>>>>>>> return; >>>>>>>> } >>>>>>>> >>>>>>>> if(logger.isInfoEnabled()) { >>>>>>>> logger.info("Loading cayenne domain config from " + cayenneConfig); >>>>>>>> } >>>>>>>> >>>>>>>> Module module = new M2CayenneModule(); >>>>>>>> cayenneRuntime = new ServerRuntime(cayenneConfig, module); >>>>>>>> >>>>>>>> CacheInvalidationFilter cacheInvalidationFilter = new >>>>>>>> CacheInvalidationFilter(); >>>>>>>> cayenneRuntime.getDataDomain().addFilter(cacheInvalidationFilter); >>>>>>> >>>>>>> >>>>>>> Here is the annotation on an object: >>>>>>> >>>>>>> @CacheGroups("minimal_cache") >>>>>>>> public class StatusFirm extends _StatusFirm implements >>>>>>>> com.m2.domain.StatusFirm { >>>>>>>> } >>>>>>> >>>>>>> >>>>>>> However, when this object is returned during a find, it uses the >>>> default >>>>>>> cache group. Like I said, however, if I specify the cache group in >>>> the >>>>>>> code, it works. So I know ehcache is being used and is configured >>>>>>> correctly. >>>>>>> >>>>>>> Thanks again for the help. >>>>>>> >>>>>>> -Frank >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Wed, Feb 3, 2016 at 1:12 PM, Andrus Adamchik < >>>> [email protected]> >>>>>>> wrote: >>>>>>> >>>>>>>> Hi Frank, >>>>>>>> >>>>>>>> For the annotation to get processed, you will need to add >>>>>>>> CacheInvalidationFilter to your ServerRuntime. Here is an example: >>>>>>>> >>>>>>>> >>>>>>>> >>>>>> >>>> https://github.com/andrus/wowodc13/blob/94ac0f4920a5f494c4e73de717c05e5a54302921/editor/src/main/java/demo/editor/services/cayenne/EditorCayenneService.java >>>>>>>> >>>>>>>> Hope this helps, >>>>>>>> Andrus >>>>>>>> >>>>>>>>> On Feb 3, 2016, at 7:55 PM, Frank Herrmann < >>>>>>>> [email protected]> wrote: >>>>>>>>> >>>>>>>>> Hello All, >>>>>>>>> >>>>>>>>> I was wondering if there is anything special I might be missing to >>>>>>>> utilize >>>>>>>>> the @CacheGroups annotation for query caching. I have successfully >>>>>> gotten >>>>>>>>> Cayenne to use Ehcache for query caching. I have cache groups >>>> specified >>>>>>>> in >>>>>>>>> the ehcache.xml file. However, if I use the @CacheGroups >>>> annotation on >>>>>> an >>>>>>>>> object, it appears to be ignored. The caching still goes to the >>>> default >>>>>>>>> cache. If I specify the cache group in the code, i.e. >>>>>>>>> query.setCacheGroups(), everything works fine, and the cache group >>>> is >>>>>>>>> utilized. >>>>>>>>> >>>>>>>>> I am using Cayenne 3.1. >>>>>>>>> >>>>>>>>> Thanks to anyone who can point me in the right direction. >>>>>>>>> >>>>>>>>> -Frank >>>>>>>>> >>>>>>>>> -- >>>>>>>>> FRANK HERRMANN >>>>>>>>> SOFTWARE ENGINEER >>>>>>>>> >>>>>>>>> T: 561-880-2998 x1563 >>>>>>>>> >>>>>>>>> E: [email protected] >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> [image: [ Modernizing Medicine ]] <http://www.modmed.com/> >>>>>>>>> [image: [ Facebook ]] <http://www.facebook.com/modernizingmedicine >>>>> >>>>>>>> [image: >>>>>>>>> [ LinkedIn ]] < >>>> http://www.linkedin.com/company/modernizing-medicine/> >>>>>>>> [image: >>>>>>>>> [ YouTube ]] <http://www.youtube.com/user/modernizingmedicine> >>>>>> [image: [ >>>>>>>>> Twitter ]] <https://twitter.com/modmed_EMA> [image: [ Blog ]] >>>>>>>>> <http://www.modmed.com/BlogBeyondEMR> [image: [ Instagram ]] >>>>>>>>> <http://instagram.com/modernizing_medicine> >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> FRANK HERRMANN >>>>>>> SOFTWARE ENGINEER >>>>>>> >>>>>>> T: 561-880-2998 x1563 >>>>>>> >>>>>>> E: [email protected] >>>>>>> >>>>>>> >>>>>>> >>>>>>> [image: [ Modernizing Medicine ]] <http://www.modmed.com/> >>>>>>> [image: [ Facebook ]] <http://www.facebook.com/modernizingmedicine> >>>>>> [image: >>>>>>> [ LinkedIn ]] <http://www.linkedin.com/company/modernizing-medicine/ >>>>> >>>>>> [image: >>>>>>> [ YouTube ]] <http://www.youtube.com/user/modernizingmedicine> >>>> [image: [ >>>>>>> Twitter ]] <https://twitter.com/modmed_EMA> [image: [ Blog ]] >>>>>>> <http://www.modmed.com/BlogBeyondEMR> [image: [ Instagram ]] >>>>>>> <http://instagram.com/modernizing_medicine> >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> FRANK HERRMANN >>>>> SOFTWARE ENGINEER >>>>> >>>>> T: 561-880-2998 x1563 >>>>> >>>>> E: [email protected] >>>>> >>>>> >>>>> >>>>> [image: [ Modernizing Medicine ]] <http://www.modmed.com/> >>>>> [image: [ Facebook ]] <http://www.facebook.com/modernizingmedicine> >>>> [image: >>>>> [ LinkedIn ]] <http://www.linkedin.com/company/modernizing-medicine/> >>>> [image: >>>>> [ YouTube ]] <http://www.youtube.com/user/modernizingmedicine> >>>> [image: [ >>>>> Twitter ]] <https://twitter.com/modmed_EMA> [image: [ Blog ]] >>>>> <http://www.modmed.com/BlogBeyondEMR> [image: [ Instagram ]] >>>>> <http://instagram.com/modernizing_medicine> >>>> >>>> >>> >>> >>> -- >>> FRANK HERRMANN >>> SOFTWARE ENGINEER >>> >>> T: 561-880-2998 x1563 >>> >>> E: [email protected] >>> >>> >>> >>> [image: [ Modernizing Medicine ]] <http://www.modmed.com/> >>> [image: [ Facebook ]] <http://www.facebook.com/modernizingmedicine> [image: >>> [ LinkedIn ]] <http://www.linkedin.com/company/modernizing-medicine/> >>> [image: >>> [ YouTube ]] <http://www.youtube.com/user/modernizingmedicine> [image: [ >>> Twitter ]] <https://twitter.com/modmed_EMA> [image: [ Blog ]] >>> <http://www.modmed.com/BlogBeyondEMR> [image: [ Instagram ]] >>> <http://instagram.com/modernizing_medicine> >>> >>> >> >> >> -- >> FRANK HERRMANN >> SOFTWARE ENGINEER >> >> T: 561-880-2998 x1563 >> >> E: [email protected] >> >> >> >> [image: [ Modernizing Medicine ]] <http://www.modmed.com/> >> [image: [ Facebook ]] <http://www.facebook.com/modernizingmedicine> [image: >> [ LinkedIn ]] <http://www.linkedin.com/company/modernizing-medicine/> [image: >> [ YouTube ]] <http://www.youtube.com/user/modernizingmedicine> [image: [ >> Twitter ]] <https://twitter.com/modmed_EMA> [image: [ Blog ]] >> <http://www.modmed.com/BlogBeyondEMR> [image: [ Instagram ]] >> <http://instagram.com/modernizing_medicine> >> >> > > > -- > FRANK HERRMANN > SOFTWARE ENGINEER > > T: 561-880-2998 x1563 > > E: [email protected] > > > > [image: [ Modernizing Medicine ]] <http://www.modmed.com/> > [image: [ Facebook ]] <http://www.facebook.com/modernizingmedicine> [image: > [ LinkedIn ]] <http://www.linkedin.com/company/modernizing-medicine/> [image: > [ YouTube ]] <http://www.youtube.com/user/modernizingmedicine> [image: [ > Twitter ]] <https://twitter.com/modmed_EMA> [image: [ Blog ]] > <http://www.modmed.com/BlogBeyondEMR> [image: [ Instagram ]] > <http://instagram.com/modernizing_medicine>
