cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Anthony Brew <anthony.b...@swrve.com>
Subject Re: Data base externally modified
Date Fri, 02 Sep 2011 17:51:07 GMT
Hi Andrus,
               Yeah thats the most viable solution I have found so far, but
tbh but from a code point of view here I think its a risky option as it
could introduce bugs, it not all changing properties are added to the
prefetch.

query.addPrefetch(Item.SUB_ITEMS_PROPERTY);

Would be nice to have a way when the NO_CACHE item is specified to make sure
linked objects are pulled fresh also.

Thanks a million for all your help.
Anthony

On Fri, Sep 2, 2011 at 6:04 PM, Andrus Adamchik <andrus@objectstyle.org>wrote:

> To refresh a relationship, you may use a prefetch on the query:
>
>
>
>
> Andrus
>
>
> On Sep 2, 2011, at 12:51 PM, Joseph Senecal wrote:
>
> > I think the generated code for the getter() should always return the
> existing list because that is the whole point of an ORM, to manage an object
> graph in memory.
> >
> > But it should be easy to override that getter() method in the generated
> subclass to always do an uncached query.
> >
> > Joe
> >
> > On Sep 2, 2011, at 9:45 AM, Mike Kienenberger wrote:
> >
> >> There may be a better way, but one obvious way this could be done is to
> >> change the code generation so that the getter() executes a select query
> >> rather than returning an existing list.
> >>
> >> On Fri, Sep 2, 2011 at 11:28 AM, Anthony Brew <anthony.brew@swrve.com
> >wrote:
> >>
> >>> Hi,
> >>>  Just an update, and I think I forgot to include something important
> >>> Its a one to many relationship that I am seeing cached, (ie I fetch
> "Item"
> >>> and the many to one "Item.getSubItems()" are being fetched from the
> cache)
> >>>
> >>> My code now looks a bit like:
> >>>
> >>>      Expression e1 = Expression.fromString("id = $id");
> >>>      Map params = new HashMap();
> >>>      params.put("id", item.getId());
> >>>
> >>>      SelectQuery query = new SelectQuery(Item.class,
> >>> e1.expWithParameters(params));
> >>>      query.setCacheStrategy(QueryCacheStrategy.NO_CACHE);
> >>>
> >>>      List items = context.performQuery(query);
> >>>      if(items.size() != 1){
> >>>          throw new RuntimeException("");
> >>>      }
> >>>      freshitem = (Item) items.get(0);
> >>>
> >>>      subitems = freshitem.getSubItems()
> >>>
> >>> Where subitems are stale.
> >>>
> >>> I am sure I am making this more complicated than needs be. As I
> mentioned
> >>> before I would like to turn on some flag to essentially always read
> from DB
> >>> when I do items.getSubItems() if possible, or when I reload the Item
> when
> >>> its getter methods are called to make it always read from the DB the
> first
> >>> time when QueryCacheStrategy.NO_CACHE is specified...
> >>>
> >>> Thanks a Million,
> >>> Anthony
> >>>
> >>>
> >>> On Fri, Sep 2, 2011 at 3:54 PM, Mike Kienenberger <mkienenb@gmail.com
> >>>> wrote:
> >>>
> >>>> You may want to review these two threads from the end of July:
> >>>>
> >>>> OSCache is gone
> >>>> http://www.mail-archive.com/dev@cayenne.apache.org/msg06209.html
> >>>>
> >>>> EhCache integration preview
> >>>> http://www.mail-archive.com/user@cayenne.apache.org/msg06211.html
> >>>>
> >>>>
> >>>> On Fri, Sep 2, 2011 at 10:30 AM, Anthony Brew <anthony.brew@swrve.com
> >>>>> wrote:
> >>>>
> >>>>> Hi Andrus,
> >>>>>             I was just about to get back to you on, I accidentally
> >>>>> started two threads when I joined the mailing list.
> >>>>>
> >>>>> Essentially we have a ruby on rails project that creates config
on
> the
> >>>>> front
> >>>>> end, this is the part that is changing externally. Then internally
we
> >>>> read
> >>>>> these config and do a bunch of processing and write the results
to a
> >>>>> separate set of tables. The tables are in turn read by the R on
R app
> >>> but
> >>>>> never written to
> >>>>>
> >>>>> so
> >>>>> Tables      Set A                   |     Set B
> >>>>>
> >>>
> ------------------------------------------------------------------------
> >>>>> Rails       read and write         |     read only
> >>>>> Java        read only               |     read and write
> >>>>>
> >>>>> The issues I am facing are with set A changing in the app.
> >>>>>
> >>>>> I have tried forcing the Item to reload by doing this, (I cut code
> from
> >>>>> Cayennes:     DataObjectUtils.objectForPK(threadDataContext,
> >>> Item.class,
> >>>>> dirtyItem.getId());)
> >>>>>
> >>>>> private Item getItemWithNoCayenneCache(Item newGame, DataContext
> >>>>> threadDataContext) {
> >>>>>      ObjectId gameIdentifier = buildId(threadDataContext, Game.class,
> >>>>> newGame.getId());
> >>>>>
> >>>>>      return (Item) DataObjectUtils.objectForQuery(threadDataContext,
> >>>> new
> >>>>> ObjectIdQuery(
> >>>>>              gameIdentifier,
> >>>>>              false,
> >>>>>              ObjectIdQuery.CACHE_REFRESH));
> >>>>>  }
> >>>>> }
> >>>>>
> >>>>>
> >>>>> stepping into *DataObjectUtils.objectForQuery stepping into the
> Cayenne
> >>>>> code
> >>>>> I eventually get to DataContext.java*
> >>>>> *
> >>>>> *
> >>>>> where I see the following method called
> >>>>>
> >>>>> *
> >>>>> @Override
> >>>>> @SuppressWarnings("unchecked")
> >>>>> public List performQuery(Query query) {
> >>>>>      query = nonNullDelegate().willPerformQuery(this, query);
> >>>>>      if (query == null) {
> >>>>>          return new ArrayList<Object>(1);
> >>>>>      }
> >>>>>
> >>>>>      List result = onQuery(this, query).firstList();
> >>>>>      return result != null ? result : new ArrayList<Object>(1);
> >>>>> }
> >>>>> *
> >>>>>
> >>>>> however i see that the delgate in *
> >>>>> nonNullDelegate() is null and so I get back NoopDelegate.noopDelegate
> >>>> which
> >>>>> I assume is the route of my woes.
> >>>>> *
> >>>>> *
> >>>>>
> >>>>> *
> >>>>> Im interested in trying the OSCache solution you proposed in my
other
> >>>>> thread, but I am a little wary the code is stale as my maven
> >>> dependancies
> >>>>> fail (I am actually pretty new to maven so this might be my bad).
> >>>>> OSCache appears to be quite old since the OpenSymphony project died,
> >>>> maybe
> >>>>> my maven config is off, are there still active contributors?
> >>>>>
> >>>>> In my pom I have specified
> >>>>> <dependency>
> >>>>> <groupId>opensymphony</groupId>
> >>>>>  <artifactId>oscache</artifactId>
> >>>>>   <version>2.4</version>
> >>>>> </dependency>
> >>>>>
> >>>>> however the dependancies on
> >>>>>
> >>>>> - javax.jms:jms:1.1
> >>>>>
> >>>>> Thanks a Million
> >>>>> Anthony
> >>>>>
> >>>>>
> >>>>> On Fri, Sep 2, 2011 at 2:34 PM, Andrus Adamchik <
> >>> andrus@objectstyle.org
> >>>>>> wrote:
> >>>>>
> >>>>>> Could you please explain your data access patterns?
> >>>>>>
> >>>>>> E.g. if you fetch some objects and store them in an instance
> variable
> >>>> in
> >>>>>> your application, they are not going to get refreshed automatically.
> >>> To
> >>>>>> refresh objects you need to either invalidate them explicitly
via
> >>>>>> context.invalidateObjects() or run a query. All the cache settings
> >>> are
> >>>>>> essentially about optimizing query execution (refresh data,
but only
> >>> as
> >>>>>> often as needed).
> >>>>>>
> >>>>>> Andrus
> >>>>>>
> >>>>>> On Sep 2, 2011, at 9:28 AM, Anthony Brew wrote:
> >>>>>>
> >>>>>>> Hi Gary,
> >>>>>>>          Yeah thats what I am seeing in the code, but I
cant for
> >>>> the
> >>>>>> life
> >>>>>>> of me see how to turn off the caching completely in the
modeller, I
> >>>>>> actually
> >>>>>>> think it wont hit our performance very badly to have no
caching.
> >>>>>>>
> >>>>>>> The cache setting I see are the in the DataDomain Configuration
> >>>>>>>
> >>>>>>> Which has an option for a Query Cache Factory with a choice
of two
> >>>>>> classes.
> >>>>>>>    - org.apache.cayenne.cache.MapQueryCacheFactory
> >>>>>>>    - org.apache.cayenne.cache.OSQueryCacheFactory
> >>>>>>>
> >>>>>>> I selected the MapQueryCache and trie to set the size of
the object
> >>>>> cache
> >>>>>> to
> >>>>>>> 1 (couldn't set this to zero) as the application barfed
saying
> >>> caches
> >>>>> had
> >>>>>> to
> >>>>>>> be greater than size zero.
> >>>>>>>
> >>>>>>> in my cayenne.xml I see the line
> >>>>>>>
> >>>>>>> <property name="cayenne.DataRowStore.snapshot.size" value="1"/>
> >>>>>>>
> >>>>>>> was added, perhaps there is some manual setting I can add
to this
> >>>> file
> >>>>> to
> >>>>>>> turn caching off?
> >>>>>>>
> >>>>>>> All the Best,
> >>>>>>> Anthony
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>> On Fri, Sep 2, 2011 at 12:20 AM, Gary Jarrel <garyjarrel@gmail.com
> >>>>
> >>>>>> wrote:
> >>>>>>>
> >>>>>>>> I'd say that would be cache related, as Cayenne is caching
the
> >>> data
> >>>>>>>> from the database, switch the cache of in the Modeler
perhaps and
> >>>> that
> >>>>>>>> should fix your problem.
> >>>>>>>>
> >>>>>>>> G
> >>>>>>>>
> >>>>>>>> On Fri, Sep 2, 2011 at 3:04 AM, Anthony Brew <
> >>>> anthony.brew@swrve.com>
> >>>>>>>> wrote:
> >>>>>>>>> Hi,
> >>>>>>>>> I have a two processes one which writes to a several
database
> >>>>> tables
> >>>>>>>> (a
> >>>>>>>>> ruby on rails application) and a java application
that reads the
> >>>>> state
> >>>>>>>> these
> >>>>>>>>> data base tables using Cayenne and writes to other
tables.
> >>>>>>>>>
> >>>>>>>>> When the ruby modifies the underlying data-base
I am seeing that
> >>>>>> Cayenne
> >>>>>>>> is
> >>>>>>>>> not automatically picking up that the underlying
data is now
> >>>>>> inconsistant
> >>>>>>>>> and not reloading. Is there some way I can config
Cayenne to
> >>>>> aggressive
> >>>>>>>>> check some tables for updates while ignoring others?
> >>>>>>>>>
> >>>>>>>>> Thanks a Million
> >>>>>>>>> Anthony Brew
> >>>>>>>>>
> >>>>>>>>
> >>>>>>
> >>>>>>
> >>>>>
> >>>>
> >>>
> >
> >
>
>

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