cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Joseph Senecal <sene...@apple.com>
Subject Re: Data base externally modified
Date Fri, 02 Sep 2011 16:51:31 GMT
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