cayenne-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrus Adamchik <>
Subject Re: Syncing DataContexts
Date Thu, 24 Dec 2015 08:45:57 GMT
Perhaps a change in Cayenne is due. E.g. if a cached snapshot is not the one object was committed
against, we still need to dispatch the event as "invalidate" or something.


> On Dec 18, 2015, at 3:00 AM, Matt Watson <> wrote:
> Thanks Andrus,
> I was playing with this some more today, and it is calling ObjectStore.snapshotsChanged.
When everything is working correctly, I can see the proper objects in “modifiedDiffs”,
however when the object I expect to be in the modifiedDiff is not there, I can confirm that
it was previously tossed out because of the “snapshot version changed, don’t know what
to do”.  I'm going to spend more time trying to figure out why this is occurring, but I’m
pretty sure its coming from a “Select" of that object (resolving a ToOneFault).
> Since these “snapshot issues” are likely the culprit, does anyone have suggestions
for how to avoid these? Is there a bad pattern I’m using within my code, that I should look
for and replace?
> Thanks,
> Matt
>> On Dec 16, 2015, at 10:09 AM, Andrus Adamchik <> wrote:
>> Hi Matt,
>>> On Dec 15, 2015, at 11:37 PM, Matt Watson <> wrote:
>>> It is my understanding that if more than one ObjectContext has the same DataObject,
when changes to that object are committed, the other context that has that same object will
automatically be updated with the changes. But this does not seem to be happening for me.
>> Within the same VM, yes, unless you turn it off explicitly. Try running in debugger
with a breakpoint in ObjectStore.snapshotsChanged(..) method and see if it is called. 
>>> The specific scenario, is that I have two different people receiving product
to the same PurchaseOrderLine. If they both bring in that PurchaseOrderLine before anything
has been received, the “receivedQuantity” on that POL starts out at 0 (ZERO). When person
A scans a box, the POL.receivedQuantity increments to 1, and then increments to 2 when he
scans another. Then if person B scans a box, their POL still thinks the “receivedQuantity”
is ZERO and it increments it to 1. So what I have in the database is a POL with receivedQuantity
1, but there are actually InventoryTransactions showing that it should be at 3.
>> So I presume you commit after every scan? Again, this would mean the events should
be propagated and merged into objects.
>>> Not sure if this is related but we often see in the log during a commit ->
"snapshot version changed, don't know what to do…”
>> This can be related ... if this happens, IIRC Cayenne does not generate a snapshot
>>> I read the Cayenne docs here (
that it does not recommend using synchronization for a large number of users (peer Contexts),
however I tested this with only 2 and still experience the issue.  And now that I have just
reread that documentation, I may have misunderstood that the object is automatically updated,
and that instead the Context is notified of the changes via an event, but if I am not listening
that event (& handling), then that could be why the other Context does not have the updated
information on that object.
>> In addition to poor performance characteristics, snapshot syncing is prone to various
race conditions (e.g. an object property may get refreshed via an event, but then immediately
overwritten from the UI), so its use is rather limited. I'd personally turn it off and use
some other approach, e.g. optimistic locking in combination with query cache (query cache
which was discussed a few days ago here [1].
>> Andrus
>> [1]

View raw message