[
https://issues.apache.org/jira/browse/DERBY-3085?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12530547
]
Kathey Marsden commented on DERBY-3085:
---------------------------------------
Well, I guess the question now is whether the remaining data in the input
stream should be read by embedded or by Network Server. The javadoc for
setBinaryStream says:
Sets the designated parameter to the given input stream, which will have the
specified number of bytes. When a very large binary value is input to a
LONGVARBINARY parameter, it may be more practical to send it via a
java.io.InputStream object. The data will be read from the stream as needed
until end-of-file is reached.
So I think that it makes it clear that embedded is only obligated to read the
stream "as needed", so I think I will pursue a solution where the Network
Server tracks the parameter input streams and drains them after execution if
they have not been drained by the execution of the statement. Does that sound
like the right approach?
> Fails to handle BLOB fields with a PreparedStatement with size >32750 bytes
> ---------------------------------------------------------------------------
>
> Key: DERBY-3085
> URL: https://issues.apache.org/jira/browse/DERBY-3085
> Project: Derby
> Issue Type: Bug
> Components: JDBC, Network Client
> Affects Versions: 10.2.1.6, 10.2.2.0, 10.3.1.4
> Environment: Windows XP SP2
> Reporter: Mikael Aronsson
> Attachments: TestBlob.java, trace.out.norows, trace.out.withrow
>
>
> Java Version: 1.6.0_02
> Java Vendor: Sun Microsystems Inc.
> Java home: C:\Program Files\Java\jre1.6.0_02
> Java classpath: derbytools.jar
> OS name: Windows XP
> OS architecture: x86
> OS version: 5.1
> Java user name: Ma
> Java user home: C:\Documents and Settings\ma
> Java user dir: c:\tools\derby\lib
> java.specification.name: Java Platform API Specification
> java.specification.version: 1.6
> --------- Derby Information --------
> JRE - JDBC: Java SE 6 - JDBC 4.0
> [C:\tools\derby\lib\derbytools.jar] 10.3.1.4 - (561794)
> The following code fails:
> // Data is a byte[] vector
> ByteArrayInputStream is = new ByteArrayInputStream( data);
> String sql = "UPDATE MyTable SET FContents=? WHERE FName='" + name + "'";
> PreparedStatement ps = conn.prepareStatement( sql);
> ps.setBinaryStream( 1, is, data.length);
>
> if( ps.executeUpdate() == 0)
> {
> // it throws an exception here if the data array us larger then
> around 32750 bytes!!!
> }
> It look's like when the size of the data[] vector is > 32750 bytes or so it
> throws an exception like this:
> java.sql.SQLException: A network protocol error was encountered and the
> connection has been terminated: A PROTOCOL Data Stream Syntax Error was
> detected. Reason: 0x0. Plaintext connection attempt to an SSL enabled server?
> at
> org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown
> Source)
> at org.apache.derby.client.am.SqlException.getSQLException(Unknown
> Source)
> at org.apache.derby.client.am.PreparedStatement.executeUpdate(Unknown
> Source)
> The table is defined as:
> CREATE TABLE MyTable (FName varchar(300) NOT NULL,FContents BLOB(16M) NOT
> NULL)
> It does loook like this only happens with the NetWork client driver, the
> embedded driver works fine.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.