You can always use queries (with prefetches for relationships) instead of keeping references to objects.
Andrus > On Oct 29, 2019, at 5:55 PM, Andrew Willerding <awillerd...@itsurcom.com> > wrote: > > Thank you Andrus. I was chasing down the rabbit hole of looking for > something like "reload" or "refresh" . > > Is there a way to always force reads from the database? I'm not dealing with > a high traffic applications so the caching is not important to me (at this > point) and the retrieval of up-to-date data from the database is my priority. > > Andrew > > > On 2019-10-26 7:58 a.m., Andrus Adamchik wrote: >> Yes, of course: >> >> context.invalidateObjects(o); >> >> Andrus >> >> >>> On Oct 25, 2019, at 10:41 PM, Andrew Willerding <awillerd...@itsurcom.com> >>> wrote: >>> >>> Is there a way to force a Cayenne object to refresh itself from the >>> underlying database? I have a situation where two *independent* >>> Cayenne-based applications are accessing and updating the database and it >>> seems that an update from one application is not reflected in the other. >>> I'd like to manually force a refresh. >>> >>> Thanks, >>> >>> Andrew >>> >>> >>> On 2019-10-11 10:03 a.m., Andrus Adamchik wrote: >>>>> I think the docs for 4.1 still indicate it's set to true by default >>>> Yes, this was wrong. I changed it right after I wrote my reply. Should >>>> republish soon. >>>> >>>> Andrus >>>> >>>> >>>>> On Oct 11, 2019, at 9:43 AM, Andrew Willerding <awillerd...@itsurcom.com> >>>>> wrote: >>>>> >>>>> Thank you Andrus! >>>>> >>>>> This has been driving me crazy. I didn't realize this change was made. >>>>> I think the docs for 4.1 still indicate it's set to true by default >>>>> >>>>> https://cayenne.apache.org/docs/4.1/cayenne-guide/#appendix-a-configuration-properties >>>>> >>>>> * >>>>> >>>>> |cayenne.server.contexts_sync_strategy| defines whether peer >>>>> ObjectContexts should receive snapshot events after commits from >>>>> other contexts. If true (/default/), the contexts would >>>>> automatically synchronize their state with peers. >>>>> >>>>> o >>>>> >>>>> Possible values: true, false >>>>> >>>>> o >>>>> >>>>> Default value: true >>>>> >>>>> On 2019-10-11 7:21 a.m., Andrus Adamchik wrote: >>>>>> Hi Andrew, >>>>>> >>>>>> So I assume those two NotifyQueue are in different ObjectContexts? >>>>>> >>>>>> Since 4.1 we stopped doing cross-context state synchronization by >>>>>> default. So when you commit in one context, the same object in other >>>>>> contexts does not get refreshed until e.g. you run a query. This >>>>>> improves both performance and consistency in a typical multi-user >>>>>> application. But of course each app has different requirements. So you >>>>>> may turn synchronization back on when bootstrapping Cayenne: >>>>>> >>>>>> SererRuntime runtime = ServerRuntime >>>>>> .builder() >>>>>> ... >>>>>> .addModule(b -> >>>>>> ServerModule.contributeProperties(b).put(Constants.SERVER_CONTEXTS_SYNC_PROPERTY, >>>>>> "true")) >>>>>> .build(); >>>>>> >>>>>> Andrus >>>>>> >>>>>> >>>>>>> On Oct 3, 2019, at 2:43 PM, Andrew Willerding >>>>>>> <awillerd...@itsurcom.com> wrote: >>>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> I am getting some strange results in writing/reading with Threads using >>>>>>> Cayenne and I'm sure it's something I'm not understanding about >>>>>>> Cayenne's data caching. I'm hoping to get a solution to force a direct >>>>>>> read somehow but so far I haven't found anything with Mr. Google. >>>>>>> >>>>>>> I'm using 4.1.B2. >>>>>>> >>>>>>> The issue is that I believe that I am writing a value to the database >>>>>>> and the database contents reflect the update but subsequent reads in >>>>>>> other Threads are not picking up the new value. Here's an example in >>>>>>> my log file where I log the first Thread update to the object and a >>>>>>> subsequent read from another Thread >>>>>>> >>>>>>> 2019-10-03,12:38:01:727,INFO >>>>>>> ,[CAsteriskAMIMgrProxyRemoteIF-Thread-1570],ClientBase,::NotifyQueue - >>>>>>> PostUpdate NotifyQueue=[Complete](125)Test >>>>>>> call->Phone=416-712-2323::NotifyEvent=[Running](15)Test call >>>>>>> 2019-10-03,12:38:01:728,INFO >>>>>>> ,[NotifyTypeHandlerDialer-pool-449-thread-1],ClientBase,::NotifyQueue - >>>>>>> PostLoad NotifyQueue=[Running](125)Test >>>>>>> call->Phone=416-712-2323::NotifyEvent=[Running](15)Test call >>>>>>> >>>>>>> The first line PostUpdate shows that the NotifyQueue item (125) is >>>>>>> Complete and when I check the database the value is definitely showing >>>>>>> Complete. However the next line from a different thread is reading the >>>>>>> same NotifyQueue record (125) and it's displaying Running. I don't >>>>>>> understand how this is possible. All indications show the PostUpdate >>>>>>> is working but PostLoad is not picking up the changed value. >>>>>>> >>>>>>> Here's a second example with another pair of NotifyQueue items >>>>>>> (127,129). The Web page picks up the correct status values (Complete) >>>>>>> as indicated in the log below >>>>>>> >>>>>>> 2019-10-03,13:31:07:535,INFO >>>>>>> ,[http-nio-8080-exec-126],ClientBase,::NotifyQueue - PostLoad >>>>>>> NotifyQueue=[Complete](127)Test >>>>>>> call->Phone=416-712-2323::NotifyEvent=[New](17)Test call >>>>>>> 2019-10-03,13:31:07:535,INFO >>>>>>> ,[http-nio-8080-exec-126],ClientBase,::NotifyQueue - PostLoad >>>>>>> NotifyQueue=[Complete](129)Test >>>>>>> call->Phone=416-712-2323::NotifyEvent=[New](19)Test call >>>>>>> >>>>>>> And the background ThreadNotifyEventsForClient again does not pickup >>>>>>> the updated Complete status (shows Running) more than a few seconds >>>>>>> later (as opposed to the microseconds in the first logging example). >>>>>>> When I do a manual query on the DB, the status is definitely Complete. >>>>>>> >>>>>>> 2019-10-03,13:31:32:265,INFO >>>>>>> ,[ThreadNotifyEventsForClient-pool-545-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](17)Test >>>>>>> call::checkForCompletedQueueItems NotifyQueueCount=1 >>>>>>> 2019-10-03,13:31:32:265,DEBUG,[ThreadNotifyEventsForClient-pool-545-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](17)Test >>>>>>> call::checkForCompletedQueueItems >>>>>>> NotifyQueueItem=NotifyQueue=[Running](127)Test >>>>>>> call->Phone=416-712-2323::NotifyEvent=[Running](17)Test call >>>>>>> 2019-10-03,13:31:32:265,DEBUG,[ThreadNotifyEventsForClient-pool-545-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](17)Test >>>>>>> call::checkForCompletedQueueItems >>>>>>> INCOMPLETE->NotifyQueue=[Running](127)Test >>>>>>> call->Phone=416-712-2323::NotifyEvent=[Running](17)Test call DEBUG >>>>>>> UNCOMMITTED=0 >>>>>>> >>>>>>> 2019-10-03,13:31:32:265,INFO >>>>>>> ,[ThreadNotifyEventsForClient-pool-545-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](19)Test >>>>>>> call::checkForCompletedQueueItems NotifyQueueCount=1 >>>>>>> 2019-10-03,13:31:32:265,DEBUG,[ThreadNotifyEventsForClient-pool-545-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](19)Test >>>>>>> call::checkForCompletedQueueItems >>>>>>> NotifyQueueItem=NotifyQueue=[Running](129)Test >>>>>>> call->Phone=416-712-2323::NotifyEvent=[Running](19)Test call >>>>>>> 2019-10-03,13:31:32:265,DEBUG,[ThreadNotifyEventsForClient-pool-545-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](19)Test >>>>>>> call::checkForCompletedQueueItems >>>>>>> INCOMPLETE->NotifyQueue=[Running](129)Test >>>>>>> call->Phone=416-712-2323::NotifyEvent=[Running](19)Test call DEBUG >>>>>>> UNCOMMITTED=0 >>>>>>> 2019-10-03,13:31:32:265,INFO >>>>>>> ,[ThreadNotifyEventsForClient-pool-545-thread-1],NotifyEvent,ThreadNotifyEventsForClient::Callista >>>>>>> Computer Telephony Inc.::checkForCompletedQueueItems Done >>>>>>> >>>>>>> >>>>>>> I have now made a change in my code for the background >>>>>>> ThreadNotifyEventsForClient from >>>>>>> >>>>>>> List<NotifyQueue> listQueue = notifyEvent.getListNotifyQueue(); >>>>>>> >>>>>>> to what should be the actual underlying transaction generated by Cayenne >>>>>>> >>>>>>> List<NotifyQueue> listQueue = >>>>>>> ObjectSelect.query(NotifyQueue.class) >>>>>>> .where(NotifyQueue.NOTIFY_EVENT.eq(notifyEvent)) >>>>>>> .select(ClientBaseAdmin.getObjectContext()); >>>>>>> >>>>>>> Here's the extract from the map.xml file for the relationship >>>>>>> >>>>>>> <db-relationship name="listNotifyQueue" source="NotifyEvent" >>>>>>> target="NotifyQueue" toMany="true"> >>>>>>> <db-attribute-pair source="id" target="notifyEventID"/> >>>>>>> >>>>>>> <obj-relationship name="listNotifyQueue" source="NotifyEvent" >>>>>>> target="NotifyQueue" deleteRule="Cascade" >>>>>>> db-relationship-path="listNotifyQueue"/> >>>>>>> >>>>>>> >>>>>>> And guess what. It works consistently with the explicit code change >>>>>>> with a difference that I now get a PostLoad event now in the >>>>>>> ThreadNotifyEventsForClient >>>>>>> >>>>>>> >>>>>>> 2019-10-03,14:12:00:103,INFO >>>>>>> ,[CAsteriskAMIMgrProxyRemoteIF-Thread-5291],ClientBase,::NotifyQueue - >>>>>>> PostUpdateNotifyQueue=[Complete](133)Test >>>>>>> call->Phone=416-712-2323::NotifyEvent=[Running](23)Test call >>>>>>> >>>>>>> 2019-10-03,14:12:00:107,INFO >>>>>>> ,[ThreadNotifyEventsForClient-pool-758-thread-1],ClientBase,::NotifyQueue >>>>>>> - PostLoad NotifyQueue=[Complete](133)Test >>>>>>> call->Phone=416-712-2323::NotifyEvent=[Running](23)Test call >>>>>>> 2019-10-03,14:12:00:107,INFO >>>>>>> ,[ThreadNotifyEventsForClient-pool-758-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](23)Test >>>>>>> call::checkForCompletedQueueItems NotifyQueueCount=1 >>>>>>> 2019-10-03,14:12:00:107,DEBUG,[ThreadNotifyEventsForClient-pool-758-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](23)Test >>>>>>> call::checkForCompletedQueueItems >>>>>>> NotifyQueueItem=NotifyQueue=[Complete](133)Test >>>>>>> call->Phone=416-712-2323::NotifyEvent=[Running](23)Test call >>>>>>> 2019-10-03,14:12:00:107,INFO >>>>>>> ,[ThreadNotifyEventsForClient-pool-758-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](23)Test >>>>>>> call::checkForCompletedQueueItems NotifyEvent has been completed >>>>>>> 2019-10-03,14:12:00:107,DEBUG,[ThreadNotifyEventsForClient-pool-758-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](23)Test >>>>>>> call::checkForCompletedQueueItems Generating NotifyLog for >>>>>>> NotifyQueue->NotifyQueue=[Complete](133)Test >>>>>>> call->Phone=416-712-2323::NotifyEvent=[Running](23)Test call >>>>>>> >>>>>>> >>>>>>> Can someone explain why this is the case and how I can "fix it" without >>>>>>> the code change. >>>>>>> >>>>>>> >>>>>>> Thanks, >>>>>>> >>>>>>> Andrew >>>>>>> >>>>>>>