Robert,

OK, so I sort of understand the premise of weak references.

That brings up some questions:
1. Given that I set the Object Cache to 500 (mostly as a first guess)
2. what happens when the object count gets to 500?
        a. I presume the "weak reference" model would initiate Java-GC on 
un-referenced objects
        b. If this is true, then what happens if all of the objects are 
referenced?  (Does Cayenne start throwing exceptions?)
3. How do I monitor the data object memory?
        - I found this in the API:
                
((org.apache.cayenne.access.DataContext)BaseContext.getThreadObjectContext()).getObjectStore().getDataRowCache().size()
4. Would it be advisable to execute this method to release objects after a 
session?
        - 
((org.apache.cayenne.access.DataContext)BaseContext.getThreadObjectContext()).getObjectStore().getDataRowCache().clear()

Thanks (but still confused :) )
Joe





On Apr 8, 2010, at 8:34 PM, Robert Zeigler wrote:

> Hi Joe,
> 
> Your (original) understanding of weak references + data contexts in cayenne 3 
> is correct.
> Cayenne 2 did used strong references.  Cayenne 3, however, uses weak refs. So 
> as long as your application doesn't have any references to the object(s), it 
> (they) should be properly GC'd.
> 
> As for the relationships issue...  I wrote an app awhile ago that had 
> relationships where the "many" side of the relationship could easily be in 
> the thousands, and even ten thousands.
> What I wound up doing was implementing a custom "LowMemoryRelationshipList" 
> that circumvented some of the internals of cayenne to handle the relationship 
> manually.
> 
> As for the relationship-imposed list/memory-based filtering... this same app 
> allowed you to navigate directly from one row to a separate view for relatedd 
> objects. For instance, if viewing a list of users, there would be a column 
> for "attendance" that would report on the number of attendance records 
> associated, and then allow you to click the # of associated attendance 
> records to go directly to a listing of attendance records only for that user, 
> and all of that was done by direct sql querying. What's more, the same exact 
> code handles all entities and all relationships.  One of the nice things 
> about cayenne is the very rich set of metadata it makes available to you 
> about your objects, and I was able to leverage that to build the system. So, 
> I think you don't necessarily /have/ to abandon cayenne-managed 
> relationships, although it will take a bit of creativity to keep as much out 
> of memory as possible. :)
> 
> Robert
> 
> On Apr 8, 2010, at 4/87:12 PM , Joe Baldwin wrote:
> 
>> Michael,
>> 
>> thanks for your input.  I have started analyzing this in detail and the 
>> problem has become multidimensional.
>> 
>> Assuming a webstore pattern:
>> 
>> First, if the DataContext never goes out of scope, and the DataContext never 
>> releases references to DataObjects, then eventually *all* of the products 
>> will be loaded into the DataContext.  I can't imagine that this would be the 
>> default behavior.
>> 
>> Second: webstore reality trumps delegation to DBMS of filtering & 
>> sort-ordering, since there are not only search-based fetches, but 
>> productList relationships to "Category" and "Vendor" objects.   I was told 
>> by your team in a previous email that I (as designer) have no access to 
>> modifying or overriding relationship select-queries.   Therefore if I use 
>> the Cayenne relationship (for a Vendor or Category) to get a list of 
>> Products, I would would be forced to apply a list-based filter or 
>> sort-ordering.
>> 
>> *If* the DataContext never releases DataObjects, then eventually (as a 
>> result of the relationship imposed list-based filtering/ordering), every 
>> Product will be faulted and loaded into memory.
>> 
>> Michael, this can't be correct because then it would mimic the behavior of a 
>> memory leak.
>> 
>> On the other hand, if it is correct, then my only option left is to 
>> completely disable all Cayenne relationships, and do custom select queries 
>> which replace the relationships while including the required filtering and 
>> sort ordering.  This kind-of sounds screwy as well.
>> 
>> Therefore, I am now more confused about this than when I started. :)
>> 
>> My hope is that the DataContext now allows more control over garbage 
>> collecting objects.
>> 
>> Joe
>> 
>> 
>> 
>> On Apr 8, 2010, at 7:32 PM, Michael Gentry wrote:
>> 
>>> My Q4 comment may be based more upon my usage of Cayenne 2 than 3.  I
>>> know there is some weak reference stuff in 3 that I haven't looked
>>> into yet and perhaps it will automatically clean things up now (which
>>> would be wonderful).  I've always taken the approach of evicting
>>> things I no longer wanted so I could control my memory footprint
>>> better.  Maybe Andrus/Andrey/etc will chime in with better info here
>>> if I am incorrect on this one.
>>> 
>>> mrg
>>> 
>>> 
>>> On Thu, Apr 8, 2010 at 5:49 PM, Joe Baldwin <[email protected]> wrote:
>>>> Hi Michael,
>>>> 
>>>> Thank you for your methodical answers.
>>>> 
>>>> RE Q3
>>>> I suspected that this might be one of my problems, and I am trying to 
>>>> redesign so that I only filter & order small result lists.
>>>> 
>>>> RE Q4
>>>> Oops!   OK, this one totally threw me.  Given my understanding of the 
>>>> behavior and usage of the DataContext is somewhere between "wow" to "hmmm, 
>>>> I didn't know that",   Perhaps I need to review a primer. :)
>>>> 
>>>> But seriously:
>>>> Since I am deploying a web-app, my understanding is that in that type of 
>>>> scenario the container (via the Tomcat CayenneFilter) is instantiating and 
>>>> controlling the DataContext (and I am, presumably now accessing it via 
>>>> BaseContext.getThreadObjectContext();)  However, beyond that piece of 
>>>> understanding, I am not sure what to do with it in order to manage objects.
>>>> 
>>>> I read your docs once more and it says that the DataContext uses "weak 
>>>> references to store registered objects".  I *thought* this meant that 
>>>> (assuming I use the default configuration), that the DataContext would 
>>>> allow the DataObjects to be garbage collected, if there is no reference 
>>>> (Java Reference) and if I did not implement query caching.
>>>> 
>>>> I am confused by reading you Q4 comment and then the "Memory Management 
>>>> Strategy" documentation.
>>>> 
>>>> (Note: I am attempting to learn more about Cayenne so that I can optimize 
>>>> (and re-factor) my code.  I am still uncertain whether I should be 
>>>> implementing caching, not implementing caching, initiating garbage 
>>>> collection (after freeing objects), or just sitting back and letting 
>>>> Cayenne DataContext handle it.)
>>>> 
>>>> Thanks,
>>>> Joe
>>>> 
>>>> 
>>>> 
>>>> 
>>>> On Apr 8, 2010, at 5:18 PM, Michael Gentry wrote:
>>>> 
>>>>> Hi Joe,
>>>>> 
>>>>> Assuming 2000 products fetched with a paginated query and a page size
>>>>> of 50, I believe the answers are ...
>>>>> 
>>>>> Q1: 2000 hollow objects are created.   Cayenne fetches the primary
>>>>> keys of the objects first in a paginated query.
>>>>> 
>>>>> Q2: Whichever page (or pages) you access in the paginated list will
>>>>> fault those objects for that page (grouped by 50 at a time) into
>>>>> memory.
>>>>> 
>>>>> Q3: If you try to filter or sort in-memory, then it will have to fetch
>>>>> all of the objects.  Might be better to re-issue a query to the DB.
>>>>> 
>>>>> Q4: If your list pointers go out-of-scope, but the DataContext is
>>>>> still in-scope, then the objects will still be in the DataContext
>>>>> until you evict them.
>>>>> 
>>>>> mrg
>>>>> 
>>>>> 
>>>>> On Thu, Apr 8, 2010 at 4:24 PM, Joe Baldwin <[email protected]> 
>>>>> wrote:
>>>>>> Andrus,
>>>>>> 
>>>>>> In this same context, I have a question about what behavior I should 
>>>>>> expect to see.
>>>>>> 
>>>>>> Let us assume for this scenario:
>>>>>> 1. a web deployment with Tomcat, typical webstore pattern
>>>>>> 2. 2000-5000 products with an attribute "name"
>>>>>> 3. custom search engine built on top of cayenne
>>>>>>      a. mostly standard configuration
>>>>>>      b. set PageSize to 50
>>>>>>      c. using (presumably) default caching
>>>>>>      d. custom factory class method used to create a select query
>>>>>> 4. a user searches for "guitar" substring in the name field
>>>>>> 
>>>>>> Questions:
>>>>>> 1. Based on my tests, it appears that "hollow" objects are created but 
>>>>>> no faults are fired. (true?)
>>>>>> 2. If I display any product data for a subset less than PageSize, then 
>>>>>> only <PageSize> number of objects are faulted (true ?)
>>>>>> 3. If I execute "filterObjects" or "orderList" on the resulting list, I 
>>>>>> assume the fault is fired for all objects in the list. (true ?)
>>>>>> 4. What normally happens to these objects if my list pointers go out of 
>>>>>> scope?  (Are they GarbageCollected per Java rules?)
>>>>>> 
>>>>>> (Note: I have not been able to get much visibility in understanding (3) 
>>>>>> & (4), but I think my tests show that 1 & 2 are correct.)
>>>>>> Joe
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> On Apr 8, 2010, at 12:42 PM, Andrus Adamchik wrote:
>>>>>> 
>>>>>>> BTW, we started on some monitoring hooks inside Cayenne runtime in 3.0 
>>>>>>> per http://issues.apache.org/jira/browse/CAY-1173 , however then it was 
>>>>>>> decided that it'll work much better with the 3.1 DI-based stack. So 
>>>>>>> this is waiting for its time.
>>>>>>> 
>>>>>>> Andrus
>>>>>>> 
>>>>>>> 
>>>>>>> On Apr 7, 2010, at 6:16 PM, Joe Baldwin wrote:
>>>>>>> 
>>>>>>>> I am attempting to do more performance monitoring (with an eye towards 
>>>>>>>> optimizing my design & use of DataObject lists and lifetime).
>>>>>>>> 
>>>>>>>> The first thing I would like to do is monitor how many DataObjects are 
>>>>>>>> created and which JSP session they belong.
>>>>>>>> 
>>>>>>>> My idea was to simply create a constructor for the DataObject of 
>>>>>>>> interest and place monitoring hooks inside. I would assume that I 
>>>>>>>> could also create a finalize method to do similar things.
>>>>>>>> 
>>>>>>>> Is this the best way to create custom monitoring using Cayenne 
>>>>>>>> DataObjects or is there a better way?
>>>>>>>> 
>>>>>>>> (BTW, even after reading the docs, I am still somewhat mystified by 
>>>>>>>> how my configuration specifications control the life cycle and 
>>>>>>>> performance.  So I am hoping these custom hooks will make my design 
>>>>>>>> decisions more visible, especially with multiple users.)
>>>>>>>> 
>>>>>>>> Thanks,
>>>>>>>> Joe
>>>>>>>> 
>>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>> 
>>>> 
>>>> 
>> 
> 

Reply via email to