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: BugVersions: 10.1.2.1 Reporter: Tobias Bocanegrareading 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.
