You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by Sunitha Kambhampati <ks...@gmail.com> on 2005/09/23 04:21:29 UTC
question on IN parameter values and streams ?
I have a question about the binding of parameters using the stream api's
in JDBC
If you set the value for a parameter marker of a preparedstatement to a
stream by using the stream api's like setBinaryStream, what should be
the expected behavior on subsequent executions of the preparedstatement.
e.g
.....
ps.setBinaryStream(2,mystream, streamLength); //mystream is a user
supplied stream
for (int i = start; i < start + rows; i++) {
ps.setInt(1, i);
count += ps.executeUpdate();
}
Since the value set is a stream, the first execution will read off the
stream and the stream will be drained. In case of Derby, if the
preparedstatement is an insert, subsequent inserts will actually throw
an error as the stream will not have enough data.
I looked at the jdbc 3.0 spec, api and the tutorial book (edition 2) but
didnt find anything specific to streams and how they should be treated
when binding.
____________
1) Is it ok to expect the user to supply the stream each time when
using the stream api's provided we document it clearly.
2)or should we check to see if the user supplied stream supports the
markSupported() and reset the stream each time we finish reading it.
3) or store the data from the stream on disk for multiple re-use
4) materialize the stream so it can be used multiple times
I think #1 seems fine to me compared to all the other options unless of
course the standard has something specific to say.
Thoughts/comments ?
Thanks,
Sunitha.
ps: using stream api with update statement is probably another issue.
Re: question on IN parameter values and streams ?
Posted by "Lance J. Andersen" <La...@Sun.COM>.
i am talking to the EG about clarifying this in the spec.
-lance
Daniel John Debrunner wrote:
>Sunitha Kambhampati wrote:
>
>
>
>>I have a question about the binding of parameters using the stream api's
>>in JDBC
>>
>>If you set the value for a parameter marker of a preparedstatement to a
>>stream by using the stream api's like setBinaryStream, what should be
>>the expected behavior on subsequent executions of the preparedstatement.
>>e.g
>>.....
>>ps.setBinaryStream(2,mystream, streamLength); //mystream is a user
>>supplied stream
>>for (int i = start; i < start + rows; i++) {
>> ps.setInt(1, i);
>> count += ps.executeUpdate();
>> }
>>
>>Since the value set is a stream, the first execution will read off the
>>stream and the stream will be drained. In case of Derby, if the
>>preparedstatement is an insert, subsequent inserts will actually throw
>>an error as the stream will not have enough data.
>>I looked at the jdbc 3.0 spec, api and the tutorial book (edition 2) but
>>didnt find anything specific to streams and how they should be treated
>>when binding. ____________
>>
>>1) Is it ok to expect the user to supply the stream each time when
>>using the stream api's provided we document it clearly.
>>2)or should we check to see if the user supplied stream supports the
>>markSupported() and reset the stream each time we finish reading it.
>>3) or store the data from the stream on disk for multiple re-use
>>4) materialize the stream so it can be used multiple times
>>
>>I think #1 seems fine to me compared to all the other options unless of
>>course the standard has something specific to say.
>>
>>Thoughts/comments ?
>>
>>
>
>
>Good question, first just worry about the functional behaviour as seen
>by the JDBC client, not the implementation. So really 2,3,4 are the
>same, the parameter value set by a stream is re-used for the next execution.
>
>The only item I see in the JDBC 3.0 spec is the last paragraph of 13.2.2
>which basically says parameters are re-used. Nothing special called out
>about streams.
>
>There is a potential clue in the javadoc for
>PreparedStatement.clearParameters()
>"In general, parameter values remain in force for repeated use of a
>statement"
>
>Maybe we could take that "In general" to mean, "except for streams".
>
>I think at least option 1) is a safe solution that is forwards
>compatible with allowing a value set by a stream value to be reused. The
>error could be better by clearing the 'parameter is set' flag after the
>execution if the value was set by a stream.
>
>Dan.
>
>
>
Re: question on IN parameter values and streams ?
Posted by Daniel John Debrunner <dj...@debrunners.com>.
Sunitha Kambhampati wrote:
> I have a question about the binding of parameters using the stream api's
> in JDBC
>
> If you set the value for a parameter marker of a preparedstatement to a
> stream by using the stream api's like setBinaryStream, what should be
> the expected behavior on subsequent executions of the preparedstatement.
> e.g
> .....
> ps.setBinaryStream(2,mystream, streamLength); //mystream is a user
> supplied stream
> for (int i = start; i < start + rows; i++) {
> ps.setInt(1, i);
> count += ps.executeUpdate();
> }
>
> Since the value set is a stream, the first execution will read off the
> stream and the stream will be drained. In case of Derby, if the
> preparedstatement is an insert, subsequent inserts will actually throw
> an error as the stream will not have enough data.
> I looked at the jdbc 3.0 spec, api and the tutorial book (edition 2) but
> didnt find anything specific to streams and how they should be treated
> when binding. ____________
>
> 1) Is it ok to expect the user to supply the stream each time when
> using the stream api's provided we document it clearly.
> 2)or should we check to see if the user supplied stream supports the
> markSupported() and reset the stream each time we finish reading it.
> 3) or store the data from the stream on disk for multiple re-use
> 4) materialize the stream so it can be used multiple times
>
> I think #1 seems fine to me compared to all the other options unless of
> course the standard has something specific to say.
>
> Thoughts/comments ?
Good question, first just worry about the functional behaviour as seen
by the JDBC client, not the implementation. So really 2,3,4 are the
same, the parameter value set by a stream is re-used for the next execution.
The only item I see in the JDBC 3.0 spec is the last paragraph of 13.2.2
which basically says parameters are re-used. Nothing special called out
about streams.
There is a potential clue in the javadoc for
PreparedStatement.clearParameters()
"In general, parameter values remain in force for repeated use of a
statement"
Maybe we could take that "In general" to mean, "except for streams".
I think at least option 1) is a safe solution that is forwards
compatible with allowing a value set by a stream value to be reused. The
error could be better by clearing the 'parameter is set' flag after the
execution if the value was set by a stream.
Dan.