OperationGroup extends AutoCloseable

Mark Rotteveel mark at lawinegevaar.nl
Fri Jul 20 15:50:05 UTC 2018


On thing I am wondering about is if making OperationGroup extend 
AutoCloseable is compatible with Connection, as that is an 
OperationGroup, and has a more specific contract for close().

Mark

On 2018-07-19 19:45, Douglas Surber wrote:
> 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


More information about the jdbc-spec-discuss mailing list