closeOnCompletion

Filipe Silva filipe.silva at oracle.com
Wed Feb 17 18:55:10 UTC 2021


Well, looks strange to me. I explain why in the an answer I wrote in 
StackOverflow 
(https://stackoverflow.com/questions/66241480/jdbc-statement-closeoncompletion-should-close-statement-on-next-execution/66248074#66248074).

Moreover, IMO, allowing re-executions doesn't conflict with the use case 
below and it allows more.

Regards,
Filipe

On 17/02/21 18:38, Dave Cramer wrote:
>
>
> On Wed, 17 Feb 2021 at 13:33, Douglas Surber 
> <douglas.surber at oracle.com <mailto:douglas.surber at oracle.com>> wrote:
>
>     I wrote the original proposal. The intent was to handle the case
>     Lance described. It was not intended to allow multiple executions
>     of the Statement. So while the language may not be as clear as it
>     needs to be, the case Filipe described should throw on the second
>     execution of the Statement. At least that was my intent.
>
>
> Well there's enough hints in the wording to figure that out, but they 
> are just hints.
> We (postgres) are going to implement it in such a way that the 
> statement will not be executed twice
>
> Dave
>
>     Douglas
>     ------------------------------------------------------------------------
>     *From:* jdbc-spec-discuss <jdbc-spec-discuss-retn at openjdk.java.net
>     <mailto:jdbc-spec-discuss-retn at openjdk.java.net>> on behalf of
>     Lance Andersen <lance.andersen at oracle.com
>     <mailto:lance.andersen at oracle.com>>
>     *Sent:* Wednesday, February 17, 2021 9:52 AM
>     *To:* Dave Cramer <davecramer at gmail.com <mailto:davecramer at gmail.com>>
>     *Cc:* Filipe Silva <filipe.silva at oracle.com
>     <mailto:filipe.silva at oracle.com>>;
>     jdbc-spec-discuss at openjdk.java.net
>     <mailto:jdbc-spec-discuss at openjdk.java.net>
>     <jdbc-spec-discuss at openjdk.java.net
>     <mailto:jdbc-spec-discuss at openjdk.java.net>>
>     *Subject:* Re: closeOnCompletion
>     I will have to go dig back through my email archive as this was
>     first discussed in 2009.
>
>
>     The overall intent was to deal with code similar to:
>
>     ----------------------
>     ResultSet rs = foo();
>      while(rs.next() {
>          /*do something */
>     }
>     rs.close();
>
>     public ResultSet foo() {
>
>        Statement stmt = con.createStatement();
>        stmt.closeOnCompletion();
>        ResultSet rs = stmt.executeQuery(aQuery);
>        return rs
>
>     }
>     ------------------
>
>
>     We did spend a lot of time on this back in 2009 and took quite a
>     bit of time to reach agreement on the current wording.  However,
>     it does  look like there is the potential for some additional word
>     smithing.
>
>     Best
>     Lance
>
>
>
>     On Feb 17, 2021, at 12:34 PM, Dave Cramer <davecramer at gmail.com
>     <mailto:davecramer at gmail.com><mailto:davecramer at gmail.com
>     <mailto:davecramer at gmail.com>>> wrote:
>
>     On Wed, 17 Feb 2021 at 12:13, Filipe Silva
>     <filipe.silva at oracle.com
>     <mailto:filipe.silva at oracle.com><mailto:filipe.silva at oracle.com
>     <mailto:filipe.silva at oracle.com>>> wrote:
>
>     On 17/02/21 10:53, Dave Cramer wrote:
>     Interesting situation.
>
>     If we have an open statement with open resultsets and call
>     closeOnCompletion and then execute the statement a second time the
>     statement will throw an already closed exception since the spec
>     says that
>     executing a statement a second time closes any open resultsets.
>     Closing
>     said resultsets ends up closing the statement.
>
>     I'm just confirming that this is the intended behaviour. Seems about
>     right
>     since if you set closeOnCompletion you would not expect to re-use the
>     statement.
>
>     Dave Cramer
>     No, I don't think it is supposed to work like this. "Completion" means
>     that the user is done with the ResultSet(s) and explicitely calls
>     close() on it/them.
>
>     Successive executions do close previously opened ResultSets but
>     closing
>     those ResultSets implicitely (by re-executing) do not close the
>     Statement. The documentation makes it clear when it says "a call to
>     |closeOnCompletion| does effect both the *subsequent execution of
>     statements*, (...)". There would be no "subsequent execution of
>     statements" if the behavior was the one you described.
>
>
>     Well interestingly I'm told that the Oracle driver does close the
>     statement
>     on subsequent execution.
>
>     Either way I'm not sure I agree with the inference. Now we have to
>     debate
>     the word execution. Is calling the method an execution or is
>     completing the
>     call an execution ?
>
>     Dave Cramer
>
-- 

Oracle <http://www.oracle.com>
Filipe Silva, Senior Software Developer
Mobile: +351.91.009.2110
MySQL Middleware and Clients
Oracle Portugal, Lagoas Park, Edifício N.º 8, 2740-244 Porto Salvo




More information about the jdbc-spec-discuss mailing list