cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrus Adamchik <and...@objectstyle.org>
Subject Re: QueryCache @CacheGroups Annotation
Date Wed, 03 Feb 2016 20:08:30 GMT
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 <frank.herrmann@modernizingmedicine.com>
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 <andrus@objectstyle.org>
> wrote:
> 
>> Do you have an example of SelectQuery fetching StatusFirms?
>> 
>> Andrus
>> 
>>> On Feb 3, 2016, at 10:12 PM, Frank Herrmann <
>> frank.herrmann@modernizingmedicine.com> 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 <andrus@objectstyle.org>
>>> 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 <
>>>> frank.herrmann@modernizingmedicine.com> 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: frank.herrmann@modmed.com
>>>>> 
>>>>> 
>>>>> 
>>>>> [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: frank.herrmann@modmed.com
>>> 
>>> 
>>> 
>>> [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: frank.herrmann@modmed.com
> 
> 
> 
> [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>


Mime
View raw message