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 > >