OperationGroup extends AutoCloseable

Dávid Karnok akarnokd at gmail.com
Thu Jul 19 18:11:30 UTC 2018


Aren't those submit calls (supposed) asynchronous? In that case, won't the
try-with-resources terminate the group before, most likely, anything could
even happen?

The scenario sounds like typical multi-valued asynchronous flow, for which
a Flow.Publisher<Submission> source would be able to generate more
submissions as well as indicate there won't be any further submissions.

Douglas Surber <douglas.surber at oracle.com> ezt írta (időpont: 2018. júl.
19., Cs, 19:46):

> OperationGroup has a problem. It needs to be possible to add more member
> Operations to an OperationGroup after it is submitted. It is also necessary
> to know when all member Operations have been added as the OperationGroup
> cannot be completed until it knows no more member Operations will be added.
> Finally we want to minimize the likelyhood of Session execution hanging
> because an OperationGroup is waiting for more members when there are none.
>
> I approached this problem by specifying that by default no more member
> Operations can be added after the OperationGroup is submitted. For the case
> where members need to be added after submission there are two special
> methods.
>
> public Submission<T> submitHoldingForMoreMembers();
> public Submission<T> releaseProhibitingMoreMembers();
>
> The long, descriptive names are intentional. The goal is to clearly remind
> users that they must release the OperationGroup if they hold it. I’ve never
> liked this approach.
>
> I’d like to offer an alternative.
>
> - Remove submitHoldingForMoreMembers and releaseProhibitingMoreMembers.
> - Define OperationGroup to implement AutoCloseable.
> - Member Operations can be added to an open OperationGroup.
> - An OperationGroup will not be completed until after it is closed.
> - An OperationGroup must be submitted before it is closed.
>
> try (OperationGroup grp = session.operationGroup()) {
>   grp.rowCountOperation(insertSql)
>      .submit();
>   CompletionStage result = grp.submit().getCompletionStage();
>   grp.rowCountOperation(updateSql)
>      .submit();
> }
>
> A single usage pattern using try with resources seems much more reliable
> that the multiple usage patters with unfamiliar methods. Yes, the default
> case
>
>   OperationGroup grp = session.operationGroup();
>   grp.rowCountOperation(insertSql)
>      .submit();
>   grp.rowCountOperation(updateSql)
>      .submit();
>   return grp.submit().getCompletionStage();
>
> is perhaps simpler, but not by much.
>
> try (OperationGroup grp = session.operationGroup()) {
>   grp.rowCountOperation(insertSql)
>      .submit();
>   grp.rowCountOperation(updateSql)
>      .submit();
>   return grp.submit().getCompletionStage();
> }
>
> I’m starting to believe that the default case is not going to be the most
> common case. I think held OperationGroup are going to be much more common
> than I initially believed. A “held” group would look very similar to the
> “default” case.
>
> try (OperationGroup grp = session.operationGroup()) {
>   CompletionStage result = grp.submit().getCompletionStage();
>   grp.rowCountOperation(insertSql)
>      .submit();
>   grp.rowCountOperation(updateSql)
>      .submit();
>   return result;
> }
>
> The only difference is when the OperationGroup is submitted. If
> OperationGroups are always written using try with resources the forgetting
> to close one will be rare and easily noticed in code reviews. The tiny
> advantage of the default case, not having to call close, doesn’t seem to
> buy much compared to the complexity the current model adds to the held
> case. Uniform use of try with resources seems a much better approach.
>
> Thoughts?
>
> Douglas
>
>
>

-- 
Best regards,
David Karnok


More information about the jdbc-spec-discuss mailing list