cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrus Adamchik <and...@objectstyle.org>
Subject Re: Data base externally modified
Date Fri, 02 Sep 2011 17:04:50 GMT
To refresh a relationship, you may use a prefetch on the query:

query.addPrefetch(Item.SUB_ITEMS_PROPERTY);


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
View raw message