db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kathey Marsden (JIRA)" <j...@apache.org>
Subject [jira] Commented: (DERBY-3085) Fails to handle BLOB fields with a PreparedStatement with size >32750 bytes
Date Wed, 26 Sep 2007 20:27:50 GMT

    [ 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:,,
>         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] - (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
>     }
> 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.

View raw message