Thanks John. Interestingly, I did some testing and peer contexts aren’t committed until the batch iterator JDBC ResultSet is closed at the end of iteration either. This is fine but for a long running task, I thought that there was a problem (but there wasn’t). I think the only workarounds are a) to not care [which I think is probably fine or b) do other processing in another connection.
Mark > On 15 Oct 2016, at 22:34, John Huss <[email protected]> wrote: > > I would use a peer context. > > You can create a peer context like this if you runtime has been bound to > the current thread using > CayenneRuntime.bindThreadInjector(runtime.getInjector()) > > public static ObjectContext newObjectContext() { > ObjectContextFactory factory = CayenneRuntime.getThreadInjector > ().getInstance(ObjectContextFactory.class); > return (factory != null) ? factory.createContext() : null; > } > > > > On Sat, Oct 15, 2016 at 2:37 PM Mark Wardle <[email protected]> wrote: > >> Sorry… meant to say using Cayenne M4.0.M3… >> >> Mark >> >>> On 15 Oct 2016, at 20:29, Mark Wardle <[email protected]> wrote: >>> >>> I’m using ResultBatchIterator like this: >>> >>> Consumer<T> forEach = ... >>> try (ResultBatchIterator<T> iterator = query.batchIterator(context, >> batchSize)) { >>> for(List<T> batch : iterator) { >>> for (T c : batch) { >>> forEach.accept(c); >>> } >>> } >>> } >>> >>> but I also want to do some processing, inserting rows, editing objects >> etc. I see lots of SQL in my logs, but the transaction doesn’t get >> committed until the batch iterator completes, whether I use >> context.commitChanges() or context.performGenericQuery() on some custom SQL >> created using SQLTemplate. >>> >>> Is there a way of committing the transaction earlier, or should I use a >> peer object context? Is there an easy of getting a new peer editing context >> given a single object context or do I need to inject a ServerRuntime here? >>> >>> Thank you, >>> >>> Mark >>> >>> >> >>
