Yeah, the app reacting to an occasional inconsistency is probably a better approach then trying to synchronize many things at once.
Andrus > On Dec 28, 2015, at 6:25 PM, Matt Watson <m...@swarmbox.com> wrote: > > I just read about Optimistic Locking. Maybe that a strategy to use for a > scenario like this. > > Matt >> On Dec 24, 2015, at 12:45 AM, Andrus Adamchik <and...@objectstyle.org> wrote: >> >> 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. >> >> Andrus >> >>> On Dec 18, 2015, at 3:00 AM, Matt Watson <m...@swarmbox.com> 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 <and...@objectstyle.org> >>>> wrote: >>>> >>>> Hi Matt, >>>> >>>>> On Dec 15, 2015, at 11:37 PM, Matt Watson <m...@swarmbox.com> 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 event. >>>> >>>>> I read the Cayenne docs here >>>>> (https://cayenne.apache.org/docs/4.0/cayenne-guide/performance-tuning.html#turning-off-synchronization-of-objectcontexts >>>>> >>>>> <https://cayenne.apache.org/docs/4.0/cayenne-guide/performance-tuning.html#turning-off-synchronization-of-objectcontexts>) >>>>> 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] >>>> http://stackoverflow.com/questions/34244260/cayenne-cache-does-query-cache-replace-object-cache >>>> >>>> >>> >> >