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 18:02:23 GMT
Another way to refresh an object, including the content of its relationships (but not the contents
of the related objects) is this:

context.invalidateObjects(Collections.singleton(myObject));

This may be more in line of what you are trying to do.

Andrus

On Sep 2, 2011, at 1:59 PM, Andrus Adamchik wrote:

> In general a Cayenne user may be dealing with an object graph that can potentially start
at 1 entity and then span the entire DB (prefetches can be multi-step). So Cayenne can't guess
for you which relationships need to be refreshed, without potentially incurring a gigantic
query. 
> 
> So it is still your responsibility as a user to tell it how much or how little to prefetch.
And you can do something dynamic. E.g. if you decide that all the relationships you care about
are only 1 level deep, you can find an ObjEntity and iterate through all relationships to
add prefetches:
> 
> SelectQuery q = 
> ObjEntity entity = context.getEntityResolver().lookupObjEntity(MyClass.class);
> for(Relationship r : entity.getRelationships) {
>   q.addPrefetch(r.getName());
> }
> 
> Andrus
> 
> 
> On Sep 2, 2011, at 1:51 PM, Anthony Brew wrote:
> 
>> 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
View raw message