As of 5.2, the way it works is: The snapshots in EODatabase have a reference count. Each editing context that fetches an EO increments the reference count. The EO holds onto that EO via a WeakReference. When the WeakReference is reclaimed, the snapshot reference count can decrease (note CAN, not IMMEDIATELY WILL -- the editing context keeps reference queue which is only processed periodically). When the count gets to zero, the database forgets the snapshot. If you have entity caching enabled, then EODatabase ignore reference count (or keeps it at "1" as a minimum) and it will not go away in a read-only scenario. If you modify any entity of that type and saveChanges in your EditingContext, a cached entity's cache will be entirely flushed. (NB: Keep this in mind, because if you are caching a large amount of data that is writable, it will NOT be very smart about updating that cache -- It's blown away with every update and then it immediately reloads the entire set of objects for that entity at the next access)

If you have retainsAllRegisteredObjects enabled on your editing context, it will NOT use WeakReferences. Under this circumstance, the EO reference count is only decreased when 1) you dispose the editingcontext or 2) you forget or invalidate the object.

When you modify an object in an editing context, the editingcontext keeps a strong reference to the objects until you saveChanges (or revert, reset, etc), at which point the strong references are cleared and the only remaining reference is the weakreference like before.

If you have an undo manager enabled, it will keep a strong reference to the affected EO's as long as the undo is around.

I do wonder if EC's should be using SoftReferences instead of WeakReferences ... Would seem to be more friendly to the users of those EO's.

If you are using WO pre 5.2, then none of the WeakReference stuff applies, and everything is purely done with snapshot reference counting -- it should behave like retainsAllRegisteredObjects = true in 5.2.

ms

On Jan 21, 2006, at 7:44 PM, [EMAIL PROTECTED] wrote:

Hello Art;

Thank you for this documentation reference -- very interesting.

Snapshots are reference-counted ... So as long as a reference to a snapshot from any editing context exists, the snapshot will remain. But when the last reference is broken (e.g., when an editing context is freed), the snapshot will be freed.

I see what you mean from the EODatabase javadoc in that there is definitely reference counting supported, but are you sure this is still used by the EOF machinery in WO5? The thing that makes me wonder is that EC-centric reference-counting doesn't entirely correlate to the experience I've had with EC behaviours in WO5.2. I can keep one EC instance for processes which must load up at least many hundreds of thousands of EO-s over a long period and there are generally no memory blow-outs which one might otherwise expect.

I would have *guessed* that a cunning arrangement between weak and strong EC-EO-snapshot references were being used to ensure snapshots were allowed to be destroyed appropriately using GC. I would really love to see some concrete WO5-centric tech note about the workings of "fetch timestamp lag" and "EC-based snapshot maintenace" so one could be more certain about some of these aspects of EOF.

cheers.

___
Andrew Lindesay
www.lindesay.co.nz



_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/mschrag% 40mdimension.com

This email sent to [EMAIL PROTECTED]

_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to