Re: Batch iteration

2016-10-17 Thread Mark Wardle
Thanks Andrus.

Mark

> On 17 Oct 2016, at 06:28, Andrus Adamchik  wrote:
> 
> Hi Mark,
> 
> Scenario B is now the default after a recent change per [1]. We decoupled the 
> transaction handling open iterator (and all its connections) from any 
> transactions started by context commits within the iterator. Here is a 
> related mailing list thread [2].
> 
> Andrus
> 
> [1] https://issues.apache.org/jira/browse/CAY-2111
> [2] 
> https://lists.apache.org/thread.html/f1ccb1ac0f0aa974ffe32217fe4fcfe4b3d9a11ef2c8513f2f0e8436@%3Cdev.cayenne.apache.org%3E
> 
>> On Oct 16, 2016, at 11:45 PM, Mark Wardle  wrote:
>> 
>> 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  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  wrote:
>>> 
 Sorry… meant to say using Cayenne M4.0.M3…
 
 Mark
 
> On 15 Oct 2016, at 20:29, Mark Wardle  wrote:
> 
> I’m using ResultBatchIterator like this:
> 
> Consumer forEach = ...
> try (ResultBatchIterator iterator = query.batchIterator(context,
 batchSize)) {
>for(List 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
> 
> 
 
 
>> 
> 



Re: Batch iteration

2016-10-16 Thread Andrus Adamchik
Hi Mark,

Scenario B is now the default after a recent change per [1]. We decoupled the 
transaction handling open iterator (and all its connections) from any 
transactions started by context commits within the iterator. Here is a related 
mailing list thread [2].

Andrus

[1] https://issues.apache.org/jira/browse/CAY-2111
[2] 
https://lists.apache.org/thread.html/f1ccb1ac0f0aa974ffe32217fe4fcfe4b3d9a11ef2c8513f2f0e8436@%3Cdev.cayenne.apache.org%3E

> On Oct 16, 2016, at 11:45 PM, Mark Wardle  wrote:
> 
> 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  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  wrote:
>> 
>>> Sorry… meant to say using Cayenne M4.0.M3…
>>> 
>>> Mark
>>> 
 On 15 Oct 2016, at 20:29, Mark Wardle  wrote:
 
 I’m using ResultBatchIterator like this:
 
 Consumer forEach = ...
 try (ResultBatchIterator iterator = query.batchIterator(context,
>>> batchSize)) {
 for(List 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
 
 
>>> 
>>> 
> 



Re: Batch iteration

2016-10-16 Thread Mark Wardle
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  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  wrote:
> 
>> Sorry… meant to say using Cayenne M4.0.M3…
>> 
>> Mark
>> 
>>> On 15 Oct 2016, at 20:29, Mark Wardle  wrote:
>>> 
>>> I’m using ResultBatchIterator like this:
>>> 
>>> Consumer forEach = ...
>>> try (ResultBatchIterator iterator = query.batchIterator(context,
>> batchSize)) {
>>>  for(List 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
>>> 
>>> 
>> 
>> 



Re: Batch iteration

2016-10-15 Thread John Huss
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  wrote:

> Sorry… meant to say using Cayenne M4.0.M3…
>
> Mark
>
> > On 15 Oct 2016, at 20:29, Mark Wardle  wrote:
> >
> > I’m using ResultBatchIterator like this:
> >
> > Consumer forEach = ...
> > try (ResultBatchIterator iterator = query.batchIterator(context,
> batchSize)) {
> >   for(List 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
> >
> >
>
>


Re: Batch iteration

2016-10-15 Thread Mark Wardle
Sorry… meant to say using Cayenne M4.0.M3…

Mark

> On 15 Oct 2016, at 20:29, Mark Wardle  wrote:
> 
> I’m using ResultBatchIterator like this:
> 
> Consumer forEach = ...
> try (ResultBatchIterator iterator = query.batchIterator(context, 
> batchSize)) {
>   for(List 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
> 
> 



Batch iteration

2016-10-15 Thread Mark Wardle
I’m using ResultBatchIterator like this:

Consumer forEach = ...
try (ResultBatchIterator iterator = query.batchIterator(context, batchSize)) 
{
for(List 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