Prior to 3.0 release, all implementations of ObjectContext (specifically DataContext) retained hard references to all registered objects on a premise that the context itself would eventually go out of scope and release all those objects. In certain situations such as a context used for processing large data sets and/or a context staying around for a long time (e.g application-scoped context), memory would grow indefinitely, resulting in a leak.
Also there was a little-advertised workaround based on users explicitly calling ObjectStore.startTrackingNewObjects() and ObjectStore.unregisterNewObjects().
In release 3.0, by default DataContext uses weak references to store registered objects. So objects are allowed to be garbage collected by the VM if they are not referenced elsewhere in the application. "Elsewhere" usually means one of the following:
In addition to saving memory, another positive side effect of this feature is that DataContext retains fewer objects at any given time and hence internal object lookups work somewhat faster on select and commit.
In some cases automatic cleaning of registered objects may result in extra DB trips later on. Depending on a situation, this may or may not be critical, so users will need to weigh the choices of fewer queries vs. smaller memory footprint. In addition to the "dirty objects" scenario described above (and taken care by Cayenne behind the scenes), here are a few more scenarios where a user may choose a different strategy:
To ensure that weak references are not used, create a DataContext manually, passing a regular HashMap to the ObjectStore constructor.
TODO: an example, and figure out how to make it a parameter in the Modeler