I don't think reading a stream twice is supported, I thought
you were supposed to get an error - but it may depend on the
version you are running.  I believe the jdbc interpretation
was that no support is required, and results are not specified.
To support it would likely create a lot of overhead for the
normal one access case as with only one access one can just
stream the result to the user and throw it away, if you need
to support multiple accesses one either has to buffer it all
up, save it to a file, or change the get to go all the way
back to query the db.

Anyone remember what issue this was?

/mikem

Tobias Bocanegra (JIRA) wrote:
EOFException when reading from blob's binary stream
---------------------------------------------------

         Key: DERBY-1368
         URL: http://issues.apache.org/jira/browse/DERBY-1368
     Project: Derby
        Type: Bug

Versions: 10.1.2.1 Reporter: Tobias Bocanegra


reading the 'length()' of a blob reads a previously aquired binary stream.

test case:

    public static void main(String[] argv) throws Exception {
        String driver = "org.apache.derby.jdbc.EmbeddedDriver";
        String url = "jdbc:derby:derby/test;create=true";
        Class.forName(driver);
        Connection con = DriverManager.getConnection(url, "sa", "");
        con.setAutoCommit(true);

        // create table
        System.out.println("1) creating table...");
        Statement stmt = con.createStatement();
        stmt.execute("create table T1 (ID char(32) PRIMARY KEY, DATA blob(2G) not 
null)");
        stmt.close();

        // add row
        System.out.println("2) adding row...");
        byte[] data = new byte[1024*1024*1];
        data[0] = 1;
        data[1] = 2;

        PreparedStatement s = con.prepareStatement("insert into T1 (ID, DATA) values 
(?, ?)");
        s.setString(1, "id");
        s.setBytes(2, data);
        s.execute();
        s.close();

        // read row
        System.out.println("3) reading row...");
        s = con.prepareStatement("select DATA from T1 where ID = ?");
        s.setString(1, "id");
        s.execute();
        ResultSet rs = s.getResultSet();
        rs.next();
        Blob b = rs.getBlob(1);

        // test output
        System.out.println("4) Length: " + b.length());
        InputStream in = b.getBinaryStream();
        System.out.println("   First Byte: " + in.read());
        in.close();

        in = b.getBinaryStream();
        System.out.println("5) Length: " + b.length());
        System.out.println("   First Byte: " + in.read());
        in.close();

        rs.close();
        s.close();
        con.close();
    }


gives:

1) creating table...
2) adding row...
3) reading row...
4) Length: 1048576
   First Byte: 1
5) Length: 1048576
   First Byte: -1

imo, 5) is wrong.


Reply via email to